python - 如何覆盖类的 __dir__ 方法?

标签 python class metaprogramming

我想为我的类(class)更改 dir() 输出。通常,对于所有其他对象,这是通过在其类中定义自己的 __dir__ 方法来完成的。但如果我为我的类(class)这样做,它就不会被调用。

class X(object):
    def __dir__():
        raise Exception("No!")

>>>dir(X)
['__class__', '__delattr__', '__dict__',....

如何更改类的 dir() 输出?

最佳答案

那是因为dir调用了输入类型的__dir__(等价于:type(inp).__dir__(inp)) .对于类的实例,它将调用类 __dir__,但如果在类上调用,它将调用元类的 __dir__

class X(object):
    def __dir__(self):  # missing self parameter
        raise Exception("No!")

dir(X())  # instance!
# Exception: No!

因此,如果您想为您的类(而不是您的类的实例)自定义 dir,您需要为您的 X 添加一个元类:

import six

class DirMeta(type):
    def __dir__(cls):
        raise Exception("No!")

@six.add_metaclass(DirMeta)
class X(object):
    pass

dir(X)
# Exception: No!

关于python - 如何覆盖类的 __dir__ 方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46120462/

相关文章:

Python Metaclass 使用时没有改变类

python - 使用 selenium 登录 linkedin

python - Pandas 蟒 : How to create lapse since today column?

python - 如何从文本文件python中删除最大数字的行?

python - 排除 for 循环中的项目

bash - awk中的元编程,将文件转换为html表格格式

python - Ruby 在 Python 中的 “method_missing”

c++ 抽象类有问题

delphi - 如何判断一个 TClass 是否派生自另一个 TClass?

java - Android类之间的通信