【问题标题】:Python 3.9 MetaClass Property vs Classmethod PropertyPython 3.9 MetaClass 属性与 Classmethod 属性
【发布时间】: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


    【解决方案1】:

    我认为这与属性、元类或abc 无关。

    一个简单的例子:

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

    在本例中,objectint 的基类,而typeint 的元类。

    dir 函数的 official documentation 明确表示它

    试图产生最相关的,而不是完整的信息

    如果对象是类型或类对象,则列表包含其属性的名称,并递归地包含其基类的属性。

    当参数是类时,元类属性不在结果列表中

    【讨论】:

      猜你喜欢
      • 2021-11-23
      • 2011-08-23
      • 2018-11-17
      • 2012-02-10
      • 2021-06-13
      • 1970-01-01
      • 1970-01-01
      • 2021-11-24
      • 2019-10-21
      相关资源
      最近更新 更多