我看着sixohsix Twitter的包裝試圖理解的代碼,並發現例如:的Python sixohsix嘰嘰喳喳包裝
t = Twitter(...)
t.statuses.home_timeline()
世界上沒有狀態或home_timeline方法,或在Twitter的類或TwitterCall屬性,因此明確我在這裏錯過了一些python魔術。任何人都可以解釋我發生了什麼事嗎?
非常感謝!
我看着sixohsix Twitter的包裝試圖理解的代碼,並發現例如:的Python sixohsix嘰嘰喳喳包裝
t = Twitter(...)
t.statuses.home_timeline()
世界上沒有狀態或home_timeline方法,或在Twitter的類或TwitterCall屬性,因此明確我在這裏錯過了一些python魔術。任何人都可以解釋我發生了什麼事嗎?
非常感謝!
基本上Twitter
是TwitterCall
的一個子類,魔法發生在__getattr__
。如果你正在訪問一個不存在的屬性,你會得到一個AttributeError
。
當這種情況發生時,它運行extend_call
,該屬性作爲參數,將調用self.callable_cls
(這也恰好是TwitterCall
)。這導致另一個TwitterCall
對象。然後重複相同的技巧,因爲它會發現home_timeline
也不存在於該對象上。然後它會調用這個對象(因爲你正在編寫home_timeline()
)並向Twitter發送HTTP請求。
最簡單的方法是單步執行代碼,看看發生了什麼。當你訪問一個屬性時,你需要閱讀__getattr__
,當你進行方法調用時,你需要閱讀__call__
。
還有,line 141。你應該閱讀約__getattr__
。
在你的榜樣,所有的屬性不是TwitterCall
類定義(或者其後代Twitter
),也就是說,如果AttributeError
由object.__getattr__
提出,遞歸翻譯成到Twitter API的調用,與uriparts
的所有屬性結合元組。
因此,在您的示例中,將在遞歸結束時調用statuses.home_timeline
uri。
明白了!謝謝! – Sebastian
感謝您的提示! – Sebastian