1. 程式人生 > >Python 面向對象之高級編程

Python 面向對象之高級編程

sel turn 直接 item imp metaclass slots 屬性和方法 __slots__

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 面向對象之高級編程