python3,定制類,getattr相關用法
問題描述
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)
看了好久還是理解不了這語句,如能詳述一些細節,感激不盡
問題解答
回答1:getattr(object, name[, default])
class Student(object): def __init__(self):self.name = ’Michael’ def __getattr__(self,attr):return attrs = 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'
代碼流程圖
相關文章:
1. 網頁爬蟲 - 用Python3的requests庫模擬登陸Bilibili總是提示驗證碼錯誤怎么辦?2. python3.x - python連oanda的模擬交易api獲取json問題第六問3. python3.x - 關于Python圖遍歷的操作4. python3的各種庫的官方文檔中文版在哪兒可以找到5. python3.x - java調用python,python代碼自動停止了,找不到原因6. python3.x - 用批處理的start命令來運行指定Python腳本的時候,只要這個Python腳本的路徑或名字帶有中文就無法執行,請問怎么解決?7. python3.x - git bash如何運行.bat文件?8. 除了 python2 和 python3,ipython notebook 還可以用哪些內核?9. pip安裝提示Twisted錯誤問題(Python3.6.4安裝Twisted錯誤)10. 網頁爬蟲 - Python3.6 下的爬蟲總是重復爬第一頁的內容
