python3,定制类,getattr相关用法
PHP中文网
PHP中文网 2017-04-18 10:25:47
0
1
492
class Chain(object):
    def __init__(self,path=""):
        self._path = path
    def __getattr__(self,path):
        return Chain("%s/%s" %(self._path,path))
    def __call__(self,path):
        return Chain("%s/%s" %(self._path,path))
    def __str__(self):
        return self._path
    __repr__ = __str__
    
print(Chain().a.b.user("Michael").c.d)

看了好久还是理解不了这语句,如能详述一些细节,感激不尽

PHP中文网
PHP中文网

认证高级PHP讲师

全部回覆(1)
PHPzhong

getattr(object, name[, default])


class Student(object):
    def __init__(self):
        self.name = 'Michael'
    def __getattr__(self,attr):
        return attr

        
s = Student()
s.name 
    --> 'Michael'
s.score    
    -->  'score'
    

_getattr__是python裡的一個內建函數,動態傳回一個屬性
當呼叫不存在的屬性時,Python會試圖呼叫__getattr__(self,'score')來取得屬性,並且傳回score

__str__用於列印函數
__call__把類別當做類似函數一樣呼叫

程式碼執行流程:
Chain()建立一個實例,且path初始預設為"" ,Chain().a 時,類別中並沒有a 屬性,Python解析器呼叫getattr函數--> __getattr__(self,path= 'a'),
並傳回一個Chain實例,然後把/a 賦值gei path 傳入,繼續b,因為同樣沒有b 屬性,執行getattr函數,將/a/b傳入,
然後.user(“Michael ”),先會執行getattr返回Chain實例,但是因為有()括號在,所以返回的是Chain(),
這個就會調用call函數了,然後把“ChenTian”作為path傳入,然後call函數就回傳了/a/b/user/ChenTian,剩下的類別同。

.user("Michael”) 刚开始的user被getattr函数捕获,并返回Chain(),然后再执行__call__来调用 "Michael"

程式碼流程圖

熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板
關於我們 免責聲明 Sitemap
PHP中文網:公益線上PHP培訓,幫助PHP學習者快速成長!