特殊屬性

      在〈特殊屬性〉中尚無留言

特殊屬性

使用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

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *