面向對象高級編程
1)給類或者實例綁定一個方法
from types import MethodType
給實例綁定:
s.set_age=MethodType(set_age,s,Student) set_age:函數 s 實例 Student:類名
給類綁定
Student.set_age=MethodType(set_age,None,Student)
2)使用__slots__
限制class的屬性,規定哪幾個屬性可以在創建實例的時候添加屬性。
3)使用@property
裝飾器,既能檢查參數,又可以用類似屬性的方法來調用訪問類的變量
實現方式:
@property 把一個getter方法變成屬性
@xxx.setter 由@property創建出來的另外一個裝飾器。負責把setter變成屬性用來賦值
xxx就是函數名了。保持一致
eg:
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
4)多重繼承
class bat(mammal,flyable)
Mixin 迷信
多重繼承有幾個缺點。
結構複雜化,多個父類又有父類,就很複雜
順序模糊,先繼承誰,不清楚
功能衝突,相同方法名,該使用誰的方法
繼承用單一繼承
兩個以上的多重繼承必須用迷信繼承
不能單獨生成實例;
不能繼承普通類。
關於迷信繼承:
http://snoopyxdy.blog.163.com/blog/static/6011744020146311737593/
5)定製類
__slots__()
__len__()
__str__()
__iter__()
__getitem__()
__getattr__()
__call__()
6)type() and metaclass
type講解了由類到創建實例的過程
metaclass主要用於操作數據庫
ORM框架