【问题标题】:Calling builtin dir from overrided dir method in Python从 Python 中覆盖的 dir 方法调用内置 dir
【发布时间】:2018-05-06 12:48:56
【问题描述】:

我正在尝试覆盖 Python 类中的 dir 方法。在里面我想调用内置的 dir 方法,但是我调用它的尝试似乎是在调用我的方法,而不是默认的实现。

The correct way to override the __dir__ method in python 这个问题似乎很相关,但没有回答这个问题,因为他们的问题似乎是扩展一个 numpy 类,而不是调用类的默认 dir 实现

相关代码

def __dir__(self):
    return builtins.dir(self) + self.fields()

换句话说,我想要通常列出的所有内容以及其他一些内容,但 builtins.dir() 调用只是递归调用此函数。

我正在 Python 3.6 中对此进行测试

【问题讨论】:

    标签: python


    【解决方案1】:

    由于覆盖 __dir__ 仅在类的实例中很重要,您可以这样做:

    class Test:
        def test(self):
            print('hey')
    
        def __dir__(self):
            return dir(Test) + ['hello']
    

    注意dir(Test)dir(Test()) 不同,因为只有后者调用Test.__dir__

    Test.__dir__ 中使用dir(super()) 也可以,但它只为您提供parent 类的数据,因此dir(Test()) 不会包含专门存在的属性的名称在课堂上Test

    【讨论】:

    • 虽然我将它修改为 dir(type(self)) ,但它工作正常,因为我正在使用该类的子类。另外,我认为添加字典也会很好,因为现在您正在跳过实例属性。所以你有dir(type(self)) + list(self.__dict__.keys()) + self.fields()我问题中的链接SO问题也引用了super,正如你提到的,我发现它没有按预期工作。
    • 我还应该提到,虽然这对我来说作为一种解决方法很好,但它并不能回答如何直接调用内置函数的问题。我很惊讶 builtins.dir() 调用了我的方法。
    • @Jimbo,你正在直接用builtins.dir调用内置函数dir。覆盖dir 函数本身和覆盖__dir__ 方法是非常不同的。
    • 我很困惑。从我的__dir__ 方法调用builtins.dir 会导致递归(并达到递归限制)。我不清楚您将如何从用户定义的__dir__ 方法中调用一个返回与__dir__ 方法不存在相同的内容的函数。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-07-31
    • 1970-01-01
    • 2015-01-05
    • 2010-12-22
    • 1970-01-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多