Python中如何通过参数调用类成员函数?
如何通过参数调用FOO类中的bar_1方法?
你遇到的报错原因很明确:bar_1是FOO类的实例方法,它不属于全局作用域,必须绑定到FOO的实例(比如foo)上才能被正常调用。直接写bar_1会被Python当成全局变量查找,自然会报NameError。
当然可以通过参数调用bar_1,以下是几种可行的方案:
方案1:传递已绑定的实例方法
foo.bar_1已经自动绑定了self参数(即当前foo实例),直接把它作为参数传入即可:
foo(foo.bar_1)
执行后会输出:inside bar 1
方案2:修改__call__方法,手动绑定实例
如果需要传入类的未绑定方法(FOO.bar_1),可以在__call__里判断并手动传入当前实例:
def bar_2(): print("inside bar 2") class FOO: def __call__(self, *args): for arg in args: # 区分普通函数和未绑定的类方法 if hasattr(arg, '__self__') or not hasattr(arg, '__func__'): arg() else: arg(self) # 给未绑定方法传入当前实例 def bar_1(self): print("inside bar 1") foo = FOO() foo(FOO.bar_1) # 传入类的未绑定方法
执行后同样会输出inside bar 1,同时也不影响foo(bar_2)的正常执行。
方案3:用lambda表达式包装调用
通过lambda间接调用foo.bar_1,也是一种简单的实现方式:
foo(lambda: foo.bar_1())
这种方式不需要修改原类的代码,适合快速测试。
内容的提问来源于stack exchange,提问作者Sam
相关产品推荐
相关产品推荐

