如何根据变量选择类方法,实现多实例统一调用该方法?
问题描述
我定义了如下MyClass类,包含两个实例方法method_1和method_2,初始化时可传入my_constant参数:
class MyClass: def __init__(self, my_constant = 1): self.my_con = my_constant def method_1(self): statement = f"This is method 1 and my constant is {self.my_con}" return statement def method_2(self): statement = f"This is method 2 and my constant is {self.my_con}" return statement
我希望根据变量my_param的值选择其中一个方法,让该类的多个实例(如class_1、class_2、class_3)都调用这个选中的方法,避免使用if语句重复编写调用代码,能否实现如下示例中的写法?
my_param = True my_method = method_1 if my_param else method_2 class_1 = MyClass(1) class_2 = MyClass(2) class_3 = MyClass(3) my_statement_1 = class_1.my_method() my_statement_2 = class_2.my_method() my_statement_3 = class_3.my_method()
解决方案
你给出的示例写法无法直接运行,因为method_1和method_2是MyClass的实例方法,直接裸写会找不到对应的名称。不过可以通过以下几种方式实现你的需求:
方式一:直接引用类的方法对象
实例方法本质是类的属性,你可以通过MyClass.method_1获取方法对象,调用时把实例作为第一个参数传入即可:
my_param = True # 从类中获取目标方法的引用 my_method = MyClass.method_1 if my_param else MyClass.method_2 class_1 = MyClass(1) class_2 = MyClass(2) class_3 = MyClass(3) # 调用方法时传入实例 my_statement_1 = my_method(class_1) my_statement_2 = my_method(class_2) my_statement_3 = my_method(class_3)
方式二:用getattr动态获取实例方法
如果需要更灵活的方法名控制,可以用getattr函数根据方法名字符串动态获取每个实例的对应方法:
my_param = True # 确定要调用的方法名称 method_name = "method_1" if my_param else "method_2" class_1 = MyClass(1) class_2 = MyClass(2) class_3 = MyClass(3) # 动态获取实例方法并调用 my_statement_1 = getattr(class_1, method_name)() my_statement_2 = getattr(class_2, method_name)() my_statement_3 = getattr(class_3, method_name)()
方式三:给类临时绑定方法别名(不推荐)
如果你一定要用示例里class_1.my_method()的调用形式,可以临时给MyClass绑定一个别名属性,但这种方式会修改类的全局属性,可能影响其他代码,不建议在生产环境使用:
my_param = True # 给类添加临时的方法别名 MyClass.my_method = MyClass.method_1 if my_param else MyClass.method_2 class_1 = MyClass(1) class_2 = MyClass(2) class_3 = MyClass(3) # 直接通过实例调用别名方法 my_statement_1 = class_1.my_method() my_statement_2 = class_2.my_method() my_statement_3 = class_3.my_method() # 使用后建议删除这个临时属性,避免遗留影响 del MyClass.my_method
其中前两种方式是Python中处理此类需求的常规做法,方式二更适合方法名需要动态生成的场景。
内容的提问来源于stack exchange,提问作者user112495
相关产品推荐
相关产品推荐

