2013-12-07 91 views
-1

我看着sixohsix Twitter的包裝試圖理解的代碼,並發現例如:的Python sixohsix嘰嘰喳喳包裝

t = Twitter(...) 
t.statuses.home_timeline() 

世界上沒有狀態或home_timeline方法,或在Twitter的類或TwitterCall屬性,因此明確我在這裏錯過了一些python魔術。任何人都可以解釋我發生了什麼事嗎?

非常感謝!

回答

1

基本上TwitterTwitterCall的一個子類,魔法發生在__getattr__。如果你正在訪問一個不存在的屬性,你會得到一個AttributeError

當這種情況發生時,它運行extend_call,該屬性作爲參數,將調用self.callable_cls(這也恰好是TwitterCall)。這導致另一個TwitterCall對象。然後重複相同的技巧,因爲它會發現home_timeline也不存在於該對象上。然後它會調用這個對象(因爲你正在編寫home_timeline())並向Twitter發送HTTP請求。

最簡單的方法是單步執行代碼,看看發生了什麼。當你訪問一個屬性時,你需要閱讀__getattr__,當你進行方法調用時,你需要閱讀__call__

+0

感謝您的提示! – Sebastian

1

還有,line 141。你應該閱讀約__getattr__

在你的榜樣,所有的屬性不是TwitterCall類定義(或者其後代Twitter),也就是說,如果AttributeErrorobject.__getattr__提出,遞歸翻譯成到Twitter API的調用,與uriparts的所有屬性結合元組。

因此,在您的示例中,將在遞歸結束時調用statuses.home_timeline uri。

+0

明白了!謝謝! – Sebastian