2024-09-30 00:38:46 发布
网友
我正在查看sixohsixTwitter包装器,试图理解代码,并发现例如:
t = Twitter(...) t.statuses.home_timeline()
Twitter类或TwitterCall中没有statuses或home\u timeline方法或属性,所以很明显我这里缺少了一些python的魔力。有人能解释一下那里发生了什么事吗?你知道吗
提前多谢了!你知道吗
基本上Twitter是TwitterCall的一个子类,魔法发生在__getattr__。如果您正在访问一个不存在的属性,您将得到一个AttributeError。你知道吗
Twitter
TwitterCall
__getattr__
AttributeError
当发生这种情况时,它以该属性作为参数运行extend_call,并调用self.callable_cls(也恰好是TwitterCall)。这将导致另一个TwitterCall对象。然后重复相同的技巧,因为它会发现home_timeline也不存在于该对象上。然后它将调用这个对象(因为您正在编写home_timeline()),并向Twitter发出HTTP请求。你知道吗
extend_call
self.callable_cls
home_timeline
home_timeline()
最简单的方法是一步一步地浏览代码,看看发生了什么。访问属性时需要读取__getattr__,进行方法调用时需要读取__call__。你知道吗
__call__
有,line 141。你应该读一下^{}。你知道吗
在您的示例中,所有没有为TwitterCall类(或其子类Twitter)定义的属性,也就是说,如果AttributeError由object.__getattr__引发,则会递归地转换为对Twitter API的调用,uriparts将所有属性组合在一个元组中。你知道吗
object.__getattr__
uriparts
因此在您的示例中,对statuses.home_timelineuri的调用将在递归结束时进行。你知道吗
statuses.home_timeline
基本上
Twitter
是TwitterCall
的一个子类,魔法发生在__getattr__
。如果您正在访问一个不存在的属性,您将得到一个AttributeError
。你知道吗当发生这种情况时,它以该属性作为参数运行
extend_call
,并调用self.callable_cls
(也恰好是TwitterCall
)。这将导致另一个TwitterCall
对象。然后重复相同的技巧,因为它会发现home_timeline
也不存在于该对象上。然后它将调用这个对象(因为您正在编写home_timeline()
),并向Twitter发出HTTP请求。你知道吗最简单的方法是一步一步地浏览代码,看看发生了什么。访问属性时需要读取
__getattr__
,进行方法调用时需要读取__call__
。你知道吗有,line 141。你应该读一下^{} 。你知道吗
在您的示例中,所有没有为
TwitterCall
类(或其子类Twitter
)定义的属性,也就是说,如果AttributeError
由object.__getattr__
引发,则会递归地转换为对Twitter API的调用,uriparts
将所有属性组合在一个元组中。你知道吗因此在您的示例中,对
statuses.home_timeline
uri的调用将在递归结束时进行。你知道吗相关问题 更多 >
编程相关推荐