__getattr__返回自身的类时会做什么?

时间:2018-08-04 07:15:50

标签: python python-3.x

我在网站上阅读了一个示例。

示例代码在此处:

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__”在返回值时会做什么,但是在返回类本身时会变得更加复杂。

我认为这段代码的步骤是这样的:

  
      
  1. print(Chain()。status.user.timeline.list)开始。
  2.   
  3. Chain().__ init __ 将通过 path 初始化 self._path ,即
  4.   
  5. Chain().__ getattr __ 路径参数将变为“状态”。
  6.   
  7. “ __ getattr __” 将返回 Chain('%s /%s'%(self._path,path))
  8.   
  9. %s /%s 变为“ /状态”
  10.   
  11. 然后,刚刚创建的新Chain类将很快初始化。
  12.   
  13. self._path 将由 path 再次分配。
  14.   
  15. Chain().__ getattr __ 参数 path 将成为“用户”。
  16.   
  17. “ __ getattr__”将返回Chain('%s /%s'%(self._path,path))
  18.   
  19. %s /%s 成为“ /用户”
  20.   
  21. 循环...
  22.   

我的问题:

  

由于初始化,每次“ __getattr__”创建一个   新链,self._path将由''分配,所以我认为   最终输出应为“ / list”。,但结果并非如此。

     

我不知道此过程中发生了什么。

谢谢所有阅读此问题并尝试给我答案的人。

1 个答案:

答案 0 :(得分:1)

假设您有一个链条,其路径为“ / status”。现在,您可以在其上调用.user

__getattr__中,self是当前链(所以self.path'/status'),而path参数是您所使用的属性的名称尝试访问,即'user'__getattr__方法从self.pathpath构建一个新字符串,得到'/status/user'。它将此字符串传递到Chain(),以提供路径为Chain的新'/status/user'对象。

等等。