如何覆盖类的__dir__方法?

Geo*_*lin 6 python metaprogramming class

我想改变dir()我班级的输出.通常,对于所有其他对象,通过__dir__在类中定义自己的方法来完成.但如果我为我的班级做这个,那就不叫了.

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

>>>dir(X)
['__class__', '__delattr__', '__dict__',....
Run Code Online (Sandbox Code Playgroud)

如何更改dir()课程的输出?

MSe*_*ert 10

那是因为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!
Run Code Online (Sandbox Code Playgroud)

因此,如果您想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!
Run Code Online (Sandbox Code Playgroud)