将类方法包装在可调用函数中与普通函数中

问题描述 投票:0回答:1

我正在尝试装饰类方法。当我使用普通功能时,它工作得很好。但是,当我使用实现 __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'"

这是为什么?

python class
1个回答
0
投票

我将您的确切问题转发给 ChatGPT4。它必须与 Python 在实例方法上下文中和可调用对象上下文中如何处理“self”参数有关,但由于这个临时政策,我被禁止在这里发布 ChatGPT 答案:

临时政策:禁止生成式人工智能(例如ChatGPT)

所以也许你可以问问 ChatGPT 或其他大型语言模型。

© www.soinside.com 2019 - 2024. All rights reserved.