擅长:python、mysql、java
<p>基本上<code>Twitter</code>是<code>TwitterCall</code>的一个子类,魔法发生在<code>__getattr__</code>。如果您正在访问一个不存在的属性,您将得到一个<code>AttributeError</code>。你知道吗</p>
<p>当发生这种情况时,它以该属性作为参数运行<code>extend_call</code>,并调用<code>self.callable_cls</code>(也恰好是<code>TwitterCall</code>)。这将导致另一个<code>TwitterCall</code>对象。然后重复相同的技巧,因为它会发现<code>home_timeline</code>也不存在于该对象上。然后它将调用这个对象(因为您正在编写<code>home_timeline()</code>),并向Twitter发出HTTP请求。你知道吗</p>
<p>最简单的方法是一步一步地浏览代码,看看发生了什么。访问属性时需要读取<code>__getattr__</code>,进行方法调用时需要读取<code>__call__</code>。你知道吗</p>