__slots__
class Student(object):
pass
s=Student()
s.name='Michael'
print(s.name)
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
def set_score(self,score):
self.score=score
Student.set_score=set_score
>>>s.set_scroe(100)
>>>s.score
100
>>>s2.set_score(99)
>>>s2.score
99
__slots__
。可以限制该类实例能添加的属性。class Student(object):
__slots__=('name','age') #用tuple定义允许绑定的属性名称
__slots__
定义的属性仅对当前类实例有作用,对继承的子类无效。 __slots__
。子类实例允许定义的属性就是自身的__slots__
加上父类的__slots__
@property
@property
装饰器将一个方法变成属性来调用。class Student(object):
@property
def score(self):
return self._score
@score.setter
def score(self,value):
if not isinstance(value,int):
raise ValueError('score must be an integer')
if value<0 or value>100:
raise ValueError('score must between 0-100')
self._score=value
【注】把一个getter方法变成属性,只需加上@property
即可。之后@property
本身又创建了另一个装饰器@score.setter
,负责把一个setter方法变成属性赋值。至此,即拥有一个可控的属性操作
>>>s=Student()
>>>s.score=60 #实际转化为s.set_score(60)
>>>s.score #实际转化为s.get_score()
>>>s.score=9999
Traceback(most recent call last):
ValueError:score must between 0-100
class Student(object):
@property
def birth(self):
return self._birth
@birth.setter
def birth(self,value):
self._birth=value
@property
def age(self):
return 2015-self.birth
【注】上面的birth
是可读写属性,age
是只读属性
Duck Typing
一个事物是不是鸭子(duck),如果它走起来像一只鸭子,叫起来也像一只鸭子,即从表现来看像一只鸭子,则可以认定其是一只鸭子。
即一个约定要求必须实现
Duck Typing
的思想在多种编程语言里使用广泛,如Java的Interface,Python的各种protocol
Mixln
Mixln
的目的是给一个类增加多个功能,因此在设计类时,优先考虑通过多重继承来组合多个Mixln
的功能,而不是设计多层次的复杂的继承关系。Mixln
设计。