我在网站上阅读了一个示例。
示例代码在此处:
class Chain(object): def __init__(self, path=''): self._path = path def __getattr__(self, path): return Chain('%s/%s' % (self._path, path)) def __str__(self): return self._path __repr__ = __str__ print(Chain().status.user.timeline.list)
此代码的输出:
'/状态/用户/时间轴/列表'
我了解“ __getattr__”在返回值时会做什么,但是在返回类本身时会变得更加复杂。
我认为这段代码的步骤是这样的:
- print(Chain()。status.user.timeline.list)开始。
- Chain().__ init __ 将通过 path 初始化 self._path ,即
- Chain().__ getattr __ 路径参数将变为“状态”。
- “ __ getattr __” 将返回 Chain('%s /%s'%(self._path,path))
- %s /%s 变为“ /状态”
- 然后,刚刚创建的新Chain类将很快初始化。
- self._path 将由 path 再次分配。
- Chain().__ getattr __ 参数 path 将成为“用户”。
- “ __ getattr__”将返回Chain('%s /%s'%(self._path,path))
- %s /%s 成为“ /用户”
- 循环...
我的问题:
由于初始化,每次“ __getattr__”创建一个 新链,self._path将由''分配,所以我认为 最终输出应为“ / list”。,但结果并非如此。
我不知道此过程中发生了什么。
谢谢所有阅读此问题并尝试给我答案的人。
答案 0 :(得分:1)
假设您有一个链条,其路径为“ / status”。现在,您可以在其上调用.user
。
在__getattr__
中,self
是当前链(所以self.path
是'/status'
),而path
参数是您所使用的属性的名称尝试访问,即'user'
。 __getattr__
方法从self.path
和path
构建一个新字符串,得到'/status/user'
。它将此字符串传递到Chain()
,以提供路径为Chain
的新'/status/user'
对象。
等等。