2013-12-07 59 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