我正在尝试装饰类方法。当我使用普通功能时,它工作得很好。但是,当我使用实现 __call__ 的类时,尽管不在实例级别使用时表现相同,但实例级别函数会失败。这是SSCCE:
import random
class C():
"""A simple class"""
def __init__(self):
self.x = random.random()
def report(self):
return 'The value is: '+str(self.x)
class F():
"""Simulate a function"""
def __init__(self, f):
self.f = f
def __call__(self, *args, **kwargs):
return self.f(*args, **kwargs)
def decoratef(f):
def f1(*args, **kwargs):
return f(*args, **kwargs)
return f1
def decorateF(f):
def f1(*args, **kwargs):
return f(*args, **kwargs)
return F(f1) # This F is the only difference.
report0 = C.report
C.report = decoratef(report0)
print('Test_f0:', C.report(C())) # Works.
print('Test_f1:', C().report()) # Works.
C.report = decorateF(report0)
print('Test_F0:', C.report(C())) # Works.
print('Test_F1:', C().report()) #TypeError: "C.report() missing 1 required positional argument: 'self'"
这是为什么?
我将您的确切问题转发给 ChatGPT4。它必须与 Python 在实例方法上下文中和可调用对象上下文中如何处理“self”参数有关,但由于这个临时政策,我被禁止在这里发布 ChatGPT 答案:
所以也许你可以问问 ChatGPT 或其他大型语言模型。