Python 3.9 元类 属性 与类方法 属性

Python 3.9 MetaClass Property vs Classmethod Property

考虑以下代码

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)

我注意到这会在最后一行引发断言错误。 (python v3.9.6)。这是为什么?这是一个错误吗?可以根据两条未注释的行将其手动添加到 __dir__ 来修复。

我的问题是,解决此问题的最佳方法是什么?类方法 属性 或元类 属性 之间有什么根本区别吗? (即是否有任何事情我可以做或不能做,但不能做另一件事?)如果没有,我应该优先使用哪一个?

我认为这与属性、metaclasses 或 abc.

无关

一个简单的例子:

>>> int.__mro__
(<class 'int'>, <class 'object'>)
>>> isinstance(int, type)
True
>>> '__mro__' in dir(int)
False
>>> '__mro__' in dir(type)
True

在此示例中,objectint 的基础 class,而 typeint 的元 class。

dir函数的official documentation明确表示

attempts to produce the most relevant, rather than complete, information

If the object is a type or class object, the list contains the names of its attributes, and recursively of the attributes of its bases.

metaclass attributes are not in the result list when the argument is a class