python3學習筆記 定制類
阿新 • • 發佈:2018-05-04
col pan one rom 不存在 print student AS tee ,Python解釋器會試圖調用
__str__
class Student(object): def __init__(self, name): self.name = name def __str__(self): return ‘Student object (name: %s)‘ % self.name __repr__ = __str__
#作用:可以直接打印內部信息
>>> print(Student(‘Michael‘)) Student object (name: Michael)
__getattr__
當調用不存在的屬性時,比如score
__getattr__(self, ‘score‘)
來嘗試獲得屬性,這樣,我們就有機會返回score
的值:
class Student(object): def __init__(self): self.name = ‘Michael‘ def __getattr__(self, attr): if attr==‘score‘: return 99
>>> s = Student()
>>> s.name
‘Michael‘
>>> s.score
99
#返回函數也是完全可以的:
class Student(object): def __getattr__(self, attr): if attr==‘age‘: return lambda: 25
只是調用方式要變為:
>>> s.age()
25
任意調用如s.abc
都會返回None
,這是因為我們定義的__getattr__
默認返回就是None
。要讓class只響應特定的幾個屬性,我們就要按照約定,拋出AttributeError
的錯誤:
class Student(object): def __getattr__(self, attr): if attr==‘age‘: return lambda: 25 raise AttributeError(‘\‘Student\‘ object has no attribute \‘%s\‘‘ % attr)
這實際上可以把一個類的所有屬性和方法調用全部動態化處理了,不需要任何特殊手段。
作用實例:
利用完全動態的__getattr__
,我們可以寫出一個鏈式調用:
class Chain(object): def __init__(self, path=‘‘): self._path = path def __getattr__(self, path): return Chain(‘%s/%s‘ % (self._path, path)) def __str__(self): return self._path __repr__ = __str__
>>> Chain().status.user.timeline.list
‘/status/user/timeline/list‘
這樣,無論API怎麽變,SDK都可以根據URL實現完全動態的調用,而且,不隨API的增加而改變!
__call__
任何類,只需要定義一個__call__()
方法,就可以直接對實例進行調用。
class Student(object): def __init__(self, name): self.name = name def __call__(self): print(‘My name is %s.‘ % self.name)
調用方式如下:
>>> s = Student(‘Michael‘)
>>> s() # self參數不要傳入
My name is Michael.
python3學習筆記 定制類