__dir__ 提供循环引用,但 dir() 可以

我有以下类试图定义一个自定义__getattribute__:


class Item:

    def __init__(self):

        self.x = 1

    def __dir__(self):

        return ['x']

    def __getattribute__(self, i):

        if i not in dir(self):

            return "NOT DEFINED!"

        else:

            return super().__getattribute__(a)

然后我可以很好地运行它:


>>> i=Item()

>>> i.x

1

>>> i.a

'NOT DEFINED!'

但是,如果我更改此行:


if i not in dir(self):

至:


if i not in self.__dir__():

我得到了一个RecursionError它似乎在自称的东西。为什么会这样,为什么dir()和不同__dir__()?


RISEBY
浏览 98回答 1
1回答

弑天下

__getattribute__每当在对象上使用点表示法时都会调用该方法,因此会调用self.__dir__()with作为参数的方法,然后使用您的代码再次调用该方法,然后使用相同的参数再次调用该方法,从而导致无休止的递归.__getattribute__self'__dir__'self.__dir__()__getattribute__
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python