gpt4 book ai didi

python - “classmethod”对象在 Python 3 的元类方法中不可调用

转载 作者:太空宇宙 更新时间:2023-11-04 09:51:28 25 4
gpt4 key购买 nike

我正在尝试实现一个元类,它在创建第一个实例时初始化类变量。我想保留一个新的魔术方法 __load__,它应该作为类方法调用(如 __new__)。所以我是这样实现的:

class StaticLoad(type):
__loaded_classes = set()

def __call__(cls, *args, **kwargs):
if cls not in cls.__loaded_classes:
if hasattr(cls, '__load__'):
cls.__load__()
cls.__loaded_classes.add(cls)
return super().__call__(*args, **kwargs)


class BaseClass(metaclass=StaticLoad):
s = 0


class MyClass(BaseClass):
@classmethod
def __load__(cls):
print("Loading", cls.__name__, "...")
cls.s += 1


obj1 = MyClass()
obj2 = MyClass()
print(MyClass.s)

它工作正常并给出正确的结果:

Loading MyClass ...
1

现在我想将方法​​__load__默认实现为类方法,如__new__(无需每次都在上面键入@classmethod ).我试过这个:

class StaticLoad(type):
__loaded_classes = set()

def __call__(cls, *args, **kwargs):
if cls not in cls.__loaded_classes:
if hasattr(cls, '__load__'):
# I try to apply classmethod routine to make
# cls.__load__ a classmethod
classmethod(cls.__load__)()
cls.__loaded_classes.add(cls)
return super().__call__(*args, **kwargs)


class BaseClass(metaclass=StaticLoad):
s = 0


class MyClass(BaseClass):
# @classmethod line was deleted
def __load__(cls):
print("Loading", cls.__name__, "...")
cls.s += 1


obj1 = MyClass()
obj2 = MyClass()
print(MyClass.s)

我得到了错误:

Traceback (most recent call last):
File "example.py", line 22, in <module>
obj1 = MyClass()
File "example.py", line 7, in __call__
classmethod(cls.__load__)()
TypeError: 'classmethod' object is not callable

看起来 classmethod 例程仅在类定义中正确可用。

我应该如何改进我的元类以使其正常工作?我想保留我上面写的类 BaseClassMyClass 的内容,将所有魔法放入 StaticLoad

最佳答案

在@AnttiHaapala 的帮助下,解决方案很简单。而不是打电话

classmethod(cls.__load__)()

我不得不打电话

cls.__load__(cls)

关于python - “classmethod”对象在 Python 3 的元类方法中不可调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47630203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com