標籤:
@property:
既能檢查參數,又可以用類似屬性這樣簡單的方式來訪問類的變數,可以讓調用者寫出簡短的代碼
class Student(object): #birth是可讀寫屬性(多定義了一個setter的裝飾器),而age就是一個唯讀屬性 @property def birth(self): return self._birth @birth.setter def birth(self, value): self._birth = value @property def age(self): return 2014 - self._birth --------------------------------- >>>s = Student() >>>s.birth = 2000 >>>s.birth 2000 >>>s.age
@classmethod and @staticmethod@classmethod 和 @staticmethod都可以讓直接以類方式訪問某個內建函數
但@classmethod要求的第一個參數為cls(即類自身,而不是執行個體自身(執行個體自身用self))
@classmethod 的函數可以在類中繼承 http://stackoverflow.com/questions/12179271/python-classmethod-and-staticmethod-for-beginner
class Date(object): def __init__(self, month, day, year): self.month = month self.day = day self.year = year @staticmethod def millenium_1(month, day): return Date(month, day, 2000) @classmethod def millenium_2(cls, month, day): #cls is an object that holds class itself return cls(month, day, 2000) class DateTime(Date): def display(self): return "{0}-{1}-{2} - 00:00:00PM".format(self.month, self.day, self.year) new_year = Date(1, 1, 2013) millenium_new_year_1 = Date.millenium_1(1, 1) millenium_new_year_2 = Date.millenium_1(1, 1) isinstance(new_year, Date) # True isinstance(millenium_new_year, Date) # True datetime1 = DateTime(10, 10, 1990) datetime2 = DateTime.millenium_1(10, 10) datetime3 = DateTime.millenium_2(10, 10) isinstance(datetime1, DateTime) # True isinstance(datetime2, DateTime) # False isinstance(datetime2, DateTime) # True
多重繼承
【1】python中如果子類有自己的建構函式,不會自動調用父類的建構函式,如果需要用到父類的建構函式,則需要在子類的建構函式中顯式的調用。
【2】如果子類沒有自己的建構函式,則會直接從父類繼承建構函式,這在單繼承(一個子類只從一個父類派生)中沒有任何理解上的問題。
問題:如果是多繼承的情況,一個子類從多個父類派生,而子類又沒有自己的建構函式,則子類預設會繼承哪個父類的建構函式。
【3】子類從多個父類派生,而子類又沒有自己的建構函式時,
(1)按順序繼承,哪個父類在最前面且它又有自己的建構函式,就繼承它的建構函式;
(2)如果最前面第一個父類沒有建構函式,則繼承第2個的建構函式,第2個沒有的話,再往後找,以此類推。
Mixin簡介和多重繼承類似(其實可以把 Mixin 看作多重繼承的一種在特定情境下的應用),
但通常混入 Mixin 的類和 Mixin 類本身不是 is-a 的關係,混入 Mixin 類是為了添加某些(可選的)功能。
自由地混入 Mixin 類就可以靈活地為被混入的類添加不同的功能。
class Dog(Mammal, RunnableMixin, CarnivorousMixin): pass
定製類
http://www.liaoxuefeng.com/wiki/001374738125095c955c1e6d8bb493182103fac9270762a000/0013946328809098c1be08a2c7e4319bd60269f62be04fa000
https://docs.python.org/2/reference/datamodel.html#special-method-names
1. __str__、 __repr__
class Student(object): def __init__(self, name): self.name = name def __str__(self): return ‘Student object (name=%s)‘ % self.name __repr__ = __str__>>>print Student(‘David‘)>>>Student(‘David‘)----------------Student object (name=David) #__str__Student object (name=David) #__repr__
2 __getattr__
class Student(object): def __init__(self, name): self.name = ‘Michael‘ def __getattr__(self, attr): if attr==‘score‘: return 99>>>student = Student(‘David‘)>>>student.name>>>student.score>>>print student.grade---------------‘David‘99None #可以讓class只響應特定的幾個屬性(通過拋出AttributeError的錯誤)
3 __iter__
如果一個類想被用於for ... in迴圈,類似list或tuple那樣,就必須實現一個__iter__()方法,該方法返回一個迭代對象,然後,Python的for迴圈就會不斷調用該迭代對象的next()方法拿到迴圈的下一個值,直到遇到StopIteration錯誤時退出迴圈。
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 > 1000: # 退出迴圈的條件 raise StopIteration(); return self.a # 返回下一個值>>> for n in Fib():... print n,------------------------1 1 2 3 5 8 13 21 34 55 89 144 233 377 610 987
4 __getitem__
class Fib(object): def __getitem__(self, n): a, b = 1, 1 for x in range(n): a, b = b, a + b return a------------------------->>> f = Fib()>>> f[0]1>>> f[1]1>>> f[2]2>>> f[10]89>>> f[100]573147844013817084101
5 __call__
而且通過callable()函數,我們就可以判斷一個對象是否是“可調用”對象
class Student(object): def __init__(self, name): self.name = name def __call__(self): print(‘My name is %s.‘ % self.name)>>>student = Student(‘Daivd‘)>>>student()---------------------My name is David.
2015-05-09
python之物件導向進階編程