我看着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