特殊屬性
使用dir()可以列出類別裏的所有屬性, 其他包含了曾經說明過的 __slots__(白名單), __len__(與len()綁定). 經過更改這些特殊屬性, 就可以定制想要的特殊類別
__str__
定義了一個Pokemon的class, 實例化成 p1, 將p1直接印出來, 會得到如下的結果
class Pokemon(object):
def __init__(self, name=''):
self.name=name
p1=Pokemon('p1');
print(p1)
結果 :
<__main__.Pokemon object at 0x0000017A7ECD0A90>
藍色的那一大串, 就是由預設的__str__()方法傳給print印出來的. 如果覆寫了__str__(), 就可以得到不同的結果
class Pokemon(object): def __init__(self, name=''): self.name=name def __str__(self): return 'Pokemon物件, name = %s' % self.name p1=Pokemon('p1'); print(p1) 結果 : Pokemon物件, name = p1
但如果是在互動模式下直接打入 p1, 出來的結果還是原本的, 這是需要覆寫__repr__(). 不過寫成如下更方便
class Pokemon(object):
def __init__(self, name=''):
self.name=name
def __str__(self):
return 'Pokemon物件, name = %s' % self.name
__repr__ = __str__
__iter__
在for-in的迴圈中, 只要傳入list, tuple之類的物件, 都會被一個一個的拉進入, 這個機制是怎麼達成的呢.
for-in 會調用list物件的 __iter__()方法, 此方法傳回要反複運算的物件(其實就是list自已), 然後再去調用反複運算物件的__next__()方法, 直到出現StopIteration 例外
class Pokemon(object): def __init__(self, name=''): self.name=name self.a=0 def __iter__(self): return self def __next__(self): self.a+=1 if self.a >10: raise StopIteration return self.a for x in Pokemon(): print(x)
__getitem__
上述p1看似list, 但如果要取得第5個元素, 如p1[5], 還是會出錯, 此時就要再新增__getitem__()方法
class Pokemon(object): def setLevel(self, l=0): self._a=0 self.a=self._a self.level=l def __iter__(self): return self def __next__(self): self.a+=1 if self.a>10: raise StopIteration return self.a def __getitem__(self, n): return n+1 p1=Pokemon(); print(p1[5])
todo