Python面向对象高级编程

一、实例绑定属性和方法(动态语言特有)

先定义class:

class Student(object):
pass

给实例绑定一个属性

  >>> s = Student()
  >>> s.name = 'Michael' # 动态给实例绑定一个属性
  >>> print(s.name)
  Michael

给实例绑定一个方法

  >>> def set_age(self, age): # 定义一个函数作为实例方法
  ...     self.age = age
  ...
  >>> from types import MethodType
  >>> s.set_age = MethodType(set_age, s) # 给实例绑定一个方法
  >>> s.set_age(25) # 调用实例方法
  >>> s.age # 测试结果
  25

但是,给一个实例绑定的方法,对另一个实例是不起作用的

为了给所有实例都绑定方法,可以给class绑定方法:

  >>> def set_score(self, score):
  ...     self.score = score
  ...
  >>> Student.set_score = set_score

2、slots(限制实例的属性)

  class Student(object):
        __slots__ = ('name', 'age') # 用tuple定义允许绑定的属性名称

使用__slots__要注意,__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的

3、@property

Python内置的@property装饰器就是负责把一个方法变成属性调用的

把一个getter方法变成属性,只需要加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作

还可以定义只读属性,只定义getter方法,不定义setter方法就是一个只读属性

4、多重继承

在设计类的继承关系时,通常,主线都是单一继承下来的,例如,Ostrich继承自Bird。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,比如,让Ostrich除了继承自Bird外,再同时继承Runnable。这种设计通常称之为MixIn

MixIn的目的就是给一个类增加多个功能,这样,在设计类的时候,我们优先考虑通过多重继承来组合多个MixIn的功能,而不是设计多层次的复杂的继承关系。

由于Python允许使用多重继承,因此,MixIn就是一种常见的设计。只允许单一继承的语言(如Java)不能使用MixIn的设计。

5、定制类

  • str
  • repr
  • iter
  • getitem
  • getattr
  • call

6、枚举类

  from enum import Enum

  Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'))

7、使用元类

  • type

type()函数可以查看一个类型或变量的类型

type()函数既可以返回一个对象的类型,又可以创建出新的类型,比如,我们可以通过type()函数创建出Hello类,而无需通过class Hello(object)...的定义

  • metaclass
posted @ 2020-09-10 11:44  PT小陈  阅读(133)  评论(0编辑  收藏  举报