Python 面向對象之高級編程
7.面向對象高級編程
7.1使用__slots__
python動態語言,new 對象後綁定屬性和方法
Tip:給一個實例綁定的方法,對其他對象無效。可以通過對class綁定後,所有對象可以調用該方法
如果我們現在只有實例可以添加屬性,使用__slots__,只允許對Student實例添加name和age屬性,
添加其他屬性報錯
class Student(object):
__slots__ = (‘name‘, ‘age‘) # 用tuple定義允許綁定的屬性名稱
該限定只對當前對象起作用,其子類不做限定
-----------
7.2 @property 簡短的代碼又可檢查參數得正確性
class Student(object):
def get_score(self):
return self._score
def set_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
--------------------
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方法變成屬性賦值
------------------
7.3多重繼承
類的繼承問題http://python.jobbole.com/85685/
class Dog(Mammal, RunnableMixIn, CarnivorousMixIn):
pass
---------
7.4 定制類
__iter__
class Fib(object):
def __init__(self):
self.a, self.b = 0, 1 # 初始化兩個計數器a,b
def __iter__(self):
return self # 實例本身就是叠代對象,故返回自己
def __next__(self):
self.a, self.b = self.b, self.a + self.b # 計算下一個值
if self.a > 100000: # 退出循環的條件
raise StopIteration()
return self.a # 返回下一個值
for n in Fib()
print(n)
----------
7.5 枚舉類
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():
print(name, ‘=>‘, member, ‘,‘, member.value)
Enum可以把一組相關常量定義在一個class中,且class不可變,而且成員可以直接比較。
-----------------
7.6使用元類
type() ;
#動態語言和靜態語言最大的不同,就是函數和類的定義,不是編譯時定義的,而是運行時動態創建的。
先定義metaclass,就可以創建類,最後創建實例。?完全看不懂
Python 面向對象之高級編程