Discuss / Python / 对这章内容的一点理解

对这章内容的一点理解

Topic source

Nil_大黄

#22 Created at ... [Delete] [Delete and Lock User]

简单修改了一下__getattr__从输出的结果看, 每次传入的path只是最后一个“路径名”; 实例不断被初始化, 看到属性self._path一直再更新.

def __getattr__(self, path):
    print('get self._path: ', self._path)
    print('get path: ', path)
    return Chain('{}/{}'.format(self._path, path))

def __call__(self, path):
    print('call self._path: ', self._path)
    print('call path: ', path)
    return Chain('{}/{}'.format(self._path, path))

self._path:  
path:  status
self._path:  /status
path:  user
self._path:  /status/user
path:  timeline
self._path:  /status/user/timeline
path:  list
/status/user/timeline/list
====================
get self._path:  
get path:  users
call self._path:  /users
call path:  Michael
get self._path:  /users/Michael
get path:  repos
/users/Michael/repos


chaoren1128

#23 Created at ... [Delete] [Delete and Lock User]

爱你,看了俩小时没看懂,你这个真的太棒了

紆崽man

#24 Created at ... [Delete] [Delete and Lock User]

在这里明白了,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'

感谢大佬分享心得

饕餮风语

#26 Created at ... [Delete] [Delete and Lock User]

这里头属性()=.属性

.自己()是哪里提到过吗?这一步完全没想到

大有椑益!感谢!

makr

t解释得特别透彻,感谢

msuah

#30 Created at ... [Delete] [Delete and Lock User]

多谢你的分析,终于明白了。

landingguymmm

#31 Created at ... [Delete] [Delete and Lock User]

点赞!mark


Reply