对这章内容的一点理解
Topic source在这里明白了,python 解释的时候从左往右计算,碰到.
就找前面计算得出的对象的属性,根据属性返回的结果得到一个新的对象;碰到()
就将前面计算得出的对象当成一个函数,将括号里面的内容当成参数,传入到对象__call__
函数中,根据返回的结果得到一个新的对象;一直这样解释下去
比如Chain().users('michael').repos
Chain
是一个类,碰到()
就调用Chain类的解释函数,返回一个类的实例,然后碰到.
就去找前面类实例中的属性,根据__getattr__
函数返回了一个新的类实例,然后碰到了()
就将该类实例当成函数,调用实例的__call__
方法,返回一个新的类实例,如此类推,最后Chain().users('michael').repos
计算得到的是一个类的实例。
一开始如果不增加__call__
函数,直接使用老师给的代码时,Chain().users('michael').repos
会报错'Chain' object is not callable
,就是因为python 先将Chain().users
解释成了一个Chain
实例,碰到()
发现实例没有__call__
函数,就报了这样的错误。
个人觉得可能定义函数时也是创建了一个对象?比如:
>>> def dd():
print("d")
>>>dd.__call__()
d
2 是一个int对象:
>>>2 .to_bytes
<built-in method to_bytes of int object at 0x000007FEDA53C6C0>
>>> 2 .to_bytes(3,'big')
b'\x00\x00\x02'
Nil_大黄
简单修改了一下__getattr__从输出的结果看, 每次传入的path只是最后一个“路径名”; 实例不断被初始化, 看到属性self._path一直再更新.