例如,请考虑以下情况:
class FooMeta(type):
def __len__(cls):
return 9000
class GoodBar(metaclass=FooMeta):
def __len__(self):
return 9001
class BadBar(metaclass=FooMeta):
@classmethod
def __len__(cls):
return 9002
len(GoodBar) -> 9000
len(GoodBar()) -> 9001
GoodBar.__len__() -> TypeError (missing 1 required positional argument)
GoodBar().__len__() -> 9001
len(BadBar) -> 9000 (!!!)
len(BadBar()) -> 9002
BadBar.__len__() -> 9002
BadBar().__len__() -> 9002
Run Code Online (Sandbox Code Playgroud)
问题在于len(BadBar)返回 9000 而不是 9002,这是预期的行为。
这种行为(在某种程度上)记录在Python 数据模型 - 特殊方法查找中,但它没有提到任何有关类方法的内容,而且我并不真正理解与@classmethod装饰器的交互。
除了明显的元类解决方案(即替换/扩展FooMeta)之外,是否有一种方法可以覆盖或扩展元类函数,以便len(BadBar) -> 9002?
为了澄清,在我的特定用例中,我无法编辑元类,并且我不想对其进行子类化和/或创建我自己的元类,除非这是唯一可能的方法。