魔法方法、特性和叠代器
阿新 • • 發佈:2018-04-08
類定義 刪除 魔法方法 oob ron 對數 元素 indexer ont
- 構造函數
在python中,創建構造函數和容易,只需將方法init的名稱從普通的init改為魔法版__init__即可.
1 class FooBar: 2 def __init__(self): 3 self.somevar= 42 4 f = FooBar() 5 a = f.somevar 6 print(a)
執行結果
給構造函數添加幾個參數
1 class FooBar: 2 def __init__(self, value = 42): 3 self.somevar= value 4 f = FooBar() 5 a = f.somevar6 print(a)
執行結果
指定參數
1 class FooBar: 2 def __init__(self, value = 42): 3 self.somevar= value 4 f = FooBar(‘he he xiaoming‘) 5 a = f.somevar 6 print(a)
執行結果
- 重寫普通方法和特殊的構造函數
類A定義了一個名為hello的方法,並被類B繼承.
1 class A: 2 def hello(self): 3 print("Hello, I‘m A.") 4 class B(A):5 pass 6 a = A() 7 b = B() 8 a.hello() 9 b.hello()
執行結果
B重寫方法hello
1 class A: 2 def hello(self): 3 print("Hello, I‘m A.") 4 class B(A): 5 def hello(self): 6 print("Hello, I‘m B.") 7 a = A() 8 b = B() 9 a.hello() 10 b.hello()
執行結果
這個類定義了所有鳥都具備的一種基本能力:進食。從這個示例可知,鳥進食後就不在饑餓
1class Bird: 2 def __init__(self): 3 self.hungry = True 4 def eat(self): 5 if self.hungry: 6 print(‘Aaaah...‘) 7 self.hungry = False 8 else: 9 print(‘NO, thanks!‘) 10 b = Bird() 11 b.eat() 12 b.eat()
執行結果
子類SongBird,它新增了鳴叫功能
1 class Bird: 2 def __init__(self): 3 self.hungry = True 4 def eat(self): 5 if self.hungry: 6 print(‘Aaaah...‘) 7 self.hungry = False 8 else: 9 print(‘NO, thanks!‘) 10 class SongBird(Bird): 11 def __init__(self): 12 self.sound = ‘Squakw!‘ 13 def sing(self): 14 print(self.sound) 15 sb = SongBird() 16 sb.sing()
執行結果
SongBird是Bird的子類,繼承了方法eat,如果你嘗試調用它,將發現一個問題.
1 class Bird: 2 def __init__(self): 3 self.hungry = True 4 def eat(self): 5 if self.hungry: 6 print(‘Aaaah...‘) 7 self.hungry = False 8 else: 9 print(‘NO, thanks!‘) 10 class SongBird(Bird): 11 def __init__(self): 12 self.sound = ‘Squakw!‘ 13 def sing(self): 14 print(self.sound) 15 sb = SongBird() 16 sb.sing() 17 sb.eat()
執行結果
異常清楚地指出了在什麽地方:SongBird沒有屬性hungry,因為在SongBird中重寫了構造函數,擔心的構造函數沒有包含任何初始化屬性hungry的代碼.
要消除這種錯誤,SongBird的構造函數必須調用其超類(Bird)的構造函數,以確保基本的初始化得以執行。為此,有兩種方法:調用未關聯的超類構造函
數,以及使用函數super。
- 調用未關聯的超類構造函數
在SongBird類中,只添加了一行,其中包含代碼Bird.__init__(self).對實例用方法時,方法的參數self將自動關聯到實例(稱為關聯的方法)。然而,
如果你通過類調用方法(如Bird.__init__),就沒有實例與其相關聯。在這種情況下,你可隨便設置參數self.這樣的方法稱為未關聯的。
1 class Bird: 2 def __init__(self): 3 self.hungry = True 4 def eat(self): 5 if self.hungry: 6 print(‘Aaaah...‘) 7 self.hungry = False 8 else: 9 print(‘NO, thanks!‘) 10 class SongBird(Bird): 11 def __init__(self): 12 Bird.__init__(self) 13 self.sound = ‘Squakw!‘ 14 def sing(self): 15 print(self.sound) 16 sb = SongBird() 17 sb.sing() 18 sb.eat()
執行結果
- 使用函數super
如果你使用的不是舊版python,就應使用函數super.這個函數只是用於新式類。調用這個函數時,將當前類和當前實例作為參數。對其返回的對象調用方法
時,調用的將是超類(而不是當前類)的方法。因此,在songBird的構造函數中,可不適用Bird,而是shiyongsuper(SongBird,self)。
1 class Bird: 2 def __init__(self): 3 self.hungry = True 4 def eat(self): 5 if self.hungry: 6 print(‘Aaaah...‘) 7 self.hungry = False 8 else: 9 print(‘NO, thanks!‘) 10 class SongBird(Bird): 11 def __init__(self): 12 super().__init__() 13 self.sound = ‘Squakw!‘ 14 def sing(self): 15 print(self.sound) 16 sb = SongBird() 17 sb.sing() 18 sb.eat() 19 sb.eat()
執行結果
- 基本的序列和映射協議
- __len__(self): 這個方法應返回集合包含的項數,對序列來說為元素個數,對映射來說為鍵-值對數。如果__len__返回零(且沒有實現覆蓋這種行為的__nonzero__),對象在布爾上下文中將被視為假(就像空的列表、元組、字符串和字典一樣)
- __getitem__(self, key):這個方法應返回與指定鍵相關聯的值。對序列來說,鍵應該是0~n - 1的整數(也可以是負數),其中n為序列的長度。對映射來說,鍵可以使任何類型。
- __setitem__(self, key, value):這個方法應以與鍵相關聯的方式存儲值,以便以後能夠使用__getitem__來獲取。當然,僅當對象可變是才需要實現這個方法。
- __delitem__(self, key):這個方法在對對象的組成部分使用__del__語句時被調用,應刪除與key相關聯的值。同樣,僅當對象可變(且允許其項被刪除)時,才需要實現這個方法。
對於這些方法,還有一些額外的要求。
1. 對於序列:如果鍵為負整數,應從末尾往前數。換而言之,x[-n]應與x[len(x)-n]等效。
2.如果鍵的類型不合適(如對序列使用字符串鍵),可能引發TypeError異常。
3.對於序列,如果索引的類型是正確的,但不在允許的範圍內,應引發IndexError異常。
魔法方法、特性和叠代器