【发布时间】:2021-09-20 23:25:49
【问题描述】:
考虑下面的代码
from abc import ABC, ABCMeta
class MyMetaClass(ABCMeta):
@property
def metaclass_property(cls):
return "result"
# def __dir__(cls):
# return list(super().__dir__()) + ['metaclass_property']
class MyBaseClass(ABC, metaclass=MyMetaClass):
@classmethod
@property
def baseclass_property(cls):
return "result"
class MyClass(MyBaseClass, metaclass=MyMetaClass):
pass
assert MyClass.baseclass_property == "result"
assert hasattr(MyClass, 'baseclass_property')
assert 'baseclass_property' in dir(MyClass)
assert MyClass.metaclass_property == "result"
assert hasattr(MyClass, 'metaclass_property')
assert 'metaclass_property' in dir(MyClass)
我注意到这会在最后一行引发断言错误。 (蟒蛇v3.9.6)。这是为什么?它是一个错误吗?可以通过手动将其添加到__dir__ 来修复它,根据两个未注释的行。
我的问题是,解决此问题的最佳方法是什么?类方法属性或元类属性之间有什么根本区别吗? (即,有什么我可以或不能做的事情,但不是另一个?)如果没有,我应该使用哪一个?
【问题讨论】:
标签: python properties metaclass python-3.9