You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python中父类修补子类__call__方法失效的解决办法

问题:类内部使用partial绑定实例调用参数无效的解决办法

原代码与问题现象

类定义代码

from functools import partial 

class DummyClass:
    def load_values(self, prompt, num_inference_steps):
        self = partial(self, prompt=prompt, num_inference_steps=num_inference_steps)

class AnotherDummyClass(DummyClass):
    def __init__(self):
        self.some_val = 5

    def __call__(self, prompt=None, num_inference_steps=10):
        if prompt is None:
            raise ValueError("prompt cannot be None.")
        return f"Called with {prompt} and {num_inference_steps}"

测试代码

some_class = AnotherDummyClass()
some_class.load_values(prompt="Sayak", num_inference_steps=25)
some_class()

触发错误

ValueError: prompt cannot be None.

而如果在类外部直接使用partial绑定实例:

from functools import partial 

some_class = AnotherDummyClass()
some_class = partial(some_class, prompt="hey", num_inference_steps=20)
some_class()

代码可正常运行,返回Called with hey and 20。

原因分析

在DummyClass.load_values方法中,self是方法的局部参数,对它赋值只是修改了方法内部的局部变量,并不会改变外部代码中some_class变量指向的实例本身。外部调用some_class()时,依然使用的是原实例的__call__方法,没有带上绑定的参数,因此触发prompt为None的错误。

而外部直接赋值some_class = partial(...)是把变量重新指向了partial创建的新可调用对象,调用时自然会使用绑定的参数。

解决方案

方案1:让load_values返回绑定后的对象,外部重新赋值

修改DummyClass的load_values方法:

class DummyClass:
    def load_values(self, prompt, num_inference_steps):
        return partial(self, prompt=prompt, num_inference_steps=num_inference_steps)

测试代码调整为:

some_class = AnotherDummyClass()
some_class = some_class.load_values(prompt="Sayak", num_inference_steps=25)
some_class()

此方案通过返回新的partial对象,让外部变量指向绑定后的实例,与外部直接使用partial的逻辑一致。

方案2:修改实例的__call__方法,直接绑定参数

如果不想修改外部调用逻辑,可以直接修改实例的__call__属性:

class DummyClass:
    def load_values(self, prompt, num_inference_steps):
        self.__call__ = partial(self.__call__, prompt=prompt, num_inference_steps=num_inference_steps)

测试代码无需修改,调用some_class.load_values后,实例的__call__方法已被替换为绑定了参数的版本,直接调用some_class()即可正常运行。

内容的提问来源于stack exchange,提问作者S. P

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 13:21:33