Python3中能否预先收集方法调用签名并延后执行?
Python中预先收集方法调用并延迟执行的实现方式
你要的是延迟绑定实例的方法调用——直接写f(a)这种写法不行,因为会立刻尝试调用方法(此时还没创建实例,直接报错),得把「要调用的方法」和「对应的参数」先存起来,等实例创建后再绑定执行。下面给几种实用的实现方式:
方法1:存储方法名与参数列表
这是最直接的方式,把方法名(字符串形式)和参数存在列表里,等有实例后用getattr获取方法再调用:
class C: def f(self, foo): print(f"执行f,参数:{foo}") # 预先收集调用信息:(方法名, 参数) call_signatures = [("f", "a"), ("f", "b"), ("f", "c")] # 创建实例后逐个执行 myC = C() for method_name, arg in call_signatures: target_method = getattr(myC, method_name) target_method(arg)
方法2:用functools.partial延迟绑定
如果想写法更优雅,可以用functools.partial包装方法和参数,等实例出来后再传入self:
from functools import partial class C: def f(self, foo): print(f"执行f,参数:{foo}") # 预先收集带参数的partial对象,暂不绑定实例 call_signatures = [partial(C.f, foo="a"), partial(C.f, foo="b"), partial(C.f, foo="c")] # 创建实例后执行 myC = C() for func in call_signatures: func(myC)
方法3:用lambda表达式包装
也可以用lambda来封装调用逻辑,等有实例时把实例传入lambda执行:
class C: def f(self, foo): print(f"执行f,参数:{foo}") # 预先收集lambda,每个lambda接收实例作为参数 call_signatures = [lambda inst: inst.f("a"), lambda inst: inst.f("b"), lambda inst: inst.f("c")] # 创建实例后执行 myC = C() for callable_obj in call_signatures: callable_obj(myC)
注意点
- 绝对不能直接存
f(a)这种形式,因为收集时就会尝试调用方法,而实例方法必须绑定实例才能执行,此时会直接抛出TypeError。 - 如果方法有多个参数,只需要调整存储的参数部分即可,比如存储
("f", arg1, arg2),调用时用target_method(arg1, arg2)。
内容的提问来源于stack exchange,提问作者Phonon
相关产品推荐
相关产品推荐

