特殊屬性
使用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
