使用__slots__
__slots__的作用是限制实例属性,例如限制Student类的实例只能是name和age。
class Student(object):
__slots__=('name','age')
>>> s = Student() # 创建新的实例
>>> s.name = 'Michael' # 绑定属性'name'
>>> s.age = 25 # 绑定属性'age'
>>> s.score = 99 # 绑定属性'score'
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
AttributeError: 'Student' object has no attribute 'score'
可见,由于没有绑定score属性,报AttributeError错误。
@property
@property的作用是将类的方法变为属性的装饰器。(装饰器:在程序的运行中动态的添加功能。)
例如:属性的setter和getter方法,是为了对私有 属性的调用和修改。
原始写法:
class Student(object):
def get_score(self):
return self._score
def set_score(self, value):
self._score = value
@property写法
class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self, value):
self._score = value
@property把一个getter方法变成属性,只需要在方法前加上@property就可以了,此时,@property本身又创建了另一个装饰器@score.setter,负责把一个setter方法变成属性赋值,于是,我们就拥有一个可控的属性操作,程序可以根据传入的参数来判断是调用setter还是getter方法。
多重继承
继承是面向对象编程的重要方式,继承可以扩展父类的功能,也能减少子类的代码量,避免代码冗余。
继承后字类具有父类的所有方法和属性。
Mixin
在设计类的继承关系时,通常,主线都是单一继承下来的,例如,Ostrich
继承自Bird
。但是,如果需要“混入”额外的功能,通过多重继承就可以实现,比如,让Ostrich
除了继承自Bird
外,再同时继承Runnable
。这种设计通常称之为MixIn。
多重继承即一个类同时继承多个父类的方法和属性。python语言支持多重继承。
java只能单一继承,但java语言扩展功能时可以使用接口,python语言不支持接口开发,因此出现了Mixin设计。
例如:存在一个交通工具类,一个喷气式飞机类,喷气式飞机类可以继承交通工具类的方法,但交通工具类不能存在fly方法(因为不是所有的交通工具都能飞),因此还要添加飞行方法,就可以使用多重继承Mixin。
class Vehicle(object):
pass
class PlaneMixin(object):
def fly(self):
print 'I am flying'
class Airplane(Vehicle, PlaneMixin):
pass
可以看到,上面的Airplane类实现了多继承,不过它继承的第二个类我们起名为PlaneMixin,而不是Plane,这个并不影响功能,但是会告诉后来读代码的人,这个类是一个Mixin类。所以从含义上理解,Airplane只是一个Vehicle,不是一个Plane。这个Mixin,表示混入(mix-in),它告诉别人,这个类是作为功能添加到子类中,而不是作为父类,它的作用同Java中的接口。
使用Mixin类实现多重继承要非常小心
首先它必须表示某一种功能,而不是某个物品,如同Java中的Runnable,Callable等
其次它必须责任单一,如果有多个功能,那就写多个Mixin类
然后,它不依赖于子类的实现
最后,子类即便没有继承这个Mixin类,也照样可以工作,就是缺少了某个功能。