Python中如何将绑定self的活跃方法作为参数传入类内其他方法调用
问题核心原因
你这段代码无法运行的核心原因有两点:
- 直接执行
example.super_method(method1)时,全局作用域不存在method1变量,method1是Object类的内置实例方法,无法直接在全局空间访问。 super_method内部的self.method()写法错误:这里的method是传入的参数变量,不是self的固定属性,不能用点语法直接访问self.method。
常用解决方案
方案1:传入方法名字符串,用getattr动态调用
是最贴合你原始代码逻辑的实现方式,也方便做参数合法性校验:
class Object: def __init__(self, number1, number2): self.value1 = number1 self.value2 = number2 def method1(self): return self.value1 def method2(self): return self.value2 def super_method(self, method_name: str): # 从当前实例动态获取对应方法对象 target_method = getattr(self, method_name) return 2 * target_method() example = Object(4, 6) # 传入方法名的字符串形式即可 print(example.super_method("method1")) # 输出 8 print(example.super_method("method2")) # 输出 12
方案2:直接传入方法对象
如果不想传字符串,也可以根据使用场景选择传绑定/未绑定的方法对象:
传类的未绑定方法
class Object: def __init__(self, number1, number2): self.value1 = number1 self.value2 = number2 def method1(self): return self.value1 def method2(self): return self.value2 def super_method(self, unbound_method): # 未绑定方法需要手动传入self作为第一个参数 return 2 * unbound_method(self) example = Object(4, 6) # 传入类的方法属性 print(example.super_method(Object.method1)) # 输出 8 print(example.super_method(Object.method2)) # 输出 12
传实例的绑定方法
如果调用时已经确定了方法归属的实例,也可以直接传绑定好的方法:
class Object: def __init__(self, number1, number2): self.value1 = number1 self.value2 = number2 def method1(self): return self.value1 def method2(self): return self.value2 def super_method(self, bound_method): # 绑定方法已经关联了对应实例,直接调用即可 return 2 * bound_method() example = Object(4, 6) # 传入当前实例的绑定方法 print(example.super_method(example.method1)) # 输出 8 print(example.super_method(example.method2)) # 输出 12
内容的提问来源于stack exchange,提问作者SchroedersCat
相关产品推荐
相关产品推荐

