Python面向对象高级编程
__slots__:在定义class的时,定义一个特殊的__slots__变量,来限制该class实例能添加的属性
class Student(object): __slots__ = ("name","age") s = Student() s.name = "fred" s.city = "chengdu" #'Student' object has no attribute 'city' class Stu(Student): pass stu = Stu() stu.city = "chengdu" #__slots__定义的属性仅对当前类实例起作用,对继承的子类是不起作用的 #除非在子类中也定义__slots__,这样,子类实例允许定义的属性就是自身的__slots__加上父类的__slots__
@property装饰器:负责把一个方法变成属性调用
class Student(object): @property #表明接下来的birth只是一个属性 def birth(self): return self._birth @birth.setter def birth(self,value): self._birth = value @property #表明接下来的age只是一个属性 def age(self): return 2015 - self._birth s = Student() s.birth = 2000 print(s.age) #15
多重继承:一个子类可以获得多个父类的所有功能
class Dog(Mammal, RunnableMixIn, CarnivorousMixIn): pass
定制类
__str__:返回打印类时的字符串
__repr__:返回直接查看类时的字符串
__iter__:__iter__()方法,返回一个迭代对象,然后不断调用__next()__方法拿到下一个值
__next__
__getitem__:实现像list那样的功能
__getattr__:__getattr__()方法,动态返回一个属性
__call__:__call__()方法,直接对实例进行调用
class Student(object): def __init__(self,name): self.name = name def __str__(self): return "Student object (name %s)" % self.name __repr__ = __str__
枚举类
from enum import Enum Month = Enum('Month', ('Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec')) for name, member in Month.__members__.items(): #value默认从1开始 print(name, '=>', member, ',', member.value) #Jan => Month.Jan , 1 ... Dec => Month.Dec , 12
元类
- type()
用type()创建一个class对象,依次传入3个参数:
- class的名称;
- 继承的父类集合,注意Python支持多重继承,如果只有一个父类,别忘了tuple的单元素写法;
- class的方法名称与函数绑定,这里我们把函数fn绑定到方法名hello上。
Hello = type('Hello', (object,), dict(hello=fn)) # 创建Hello class
- metaclass:可以把类看成是metaclass创建出来的“实例”