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
在此示例中,object
是 int
的基础 class,而 type
是 int
的元 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
考虑以下代码
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
在此示例中,object
是 int
的基础 class,而 type
是 int
的元 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