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)