python---對於動態返回屬性__getattr__和例項直接呼叫__call__的理解
阿新 • • 發佈:2019-02-05
對於__getattr__的理解
class Chain(object):
def __init__(self,path=''):
self._path = path
def __getattr__(self,path):
print self._path,path
return Chain('%s/%s'%(self._path,path))
def __str__(self):
return self._path
print Chain().status.user.timeline.list
執行結果為:
status
/status user
/status/user timeline
/status/user/timeline list
/status/user/timeline/list
由結果可知:
首先執行Chain(),開始為空,隨後__getattr__動態增加了一個status屬性,Chain().status代表獲取了屬性,所以第一行結果為:空和status,獲取status屬性後,__getattr__函式返回值返回Chain('/status'),self._path變為/status,後面的依次執行,最後生成/status/user/timeline/list。
對於__call__的理解
一個物件例項可以有自己的屬性和方法,當我們呼叫例項方法時,我們用instance.method()
__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()
My name is Michael.
開始理解下面示例
__call__函式有個s引數,也就是對例項進行呼叫時可以帶引數。
# -*- coding:utf-8 -*-
class Chain(object):
def __init__(self,path=''):
self._path = path
def __getattr__(self,path):
print self._path,path
return Chain('%s/%s'%(self._path,path))
def __str__(self):
return self._path
def __call__(self, s):
return Chain('%s:%s'%(self._path,s))
print Chain().status.user('micheal').timeline.list
執行結果為:
status
/status user
/status/user:micheal timeline
/status/user:micheal/timeline list
/status/user:micheal/timeline/list
直接說 /status/user:micheal,把('micheal')前面看成一個整體,例如Chain().status.user,相當於一個例項,然後通過__call__對例項進行呼叫,因為有括號裡面有引數,所以定義__call__函式時,增加了s引數。
到此。僅個人理解,如有錯誤歡迎指正,本人剛開始學習python,望見諒。
筆芯~~