python---對於動態返回屬性__getattr__和實例直接調用__call__的理解

 對於__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,望見諒。

筆芯~~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章