Python如何为对象绑定非类所属方法以缩减if-else分支代码
Python对象绑定外部方法实现策略模式方案评估
现有方案的可行性与问题
你的核心设计思路是通过策略模式封装不同范围对应的执行逻辑,以此消除多分支if-else判断,这个方向是完全正确的,但是现有代码存在2处语法和逻辑错误,修正后即可正常运行:
- 第一处错误:实例化
RangeStrategie时,你传入的是pse(),这会直接执行pse函数,把它的返回值(默认是None)赋值给func参数,正确做法是传入函数对象本身,即去掉括号写pse - 第二处错误:类定义中
functions = ???是无效语法,你不需要提前在类层面定义这个类属性,因为__init__方法中已经为每个实例单独绑定了functions实例属性,直接删除这行即可。
修正后的完整代码
类定义
class RangeStrategie(object): x0 = 0 x1 = 0 name = "" def __init__(self,x0,x1,name,func): self.x0 = x0 self.x1 = x1 self.name = name self.functions = func def execute(self, y): if self.x0 <= y <= self.x1: print("--> Execute {} Option {}-{} mit {}".format(self.name,self.x0,self.x1,y)) self.functions()
调用代码
def pse(): print("Test") if __name__ == '__main__': # 传入函数对象pse而非执行结果pse() strategy = RangeStrategie(1,9,"Einer",pse) # 测试命中范围的情况 strategy.execute(5)
运行后会输出:
--> Execute Einer Option 1-9 mit 5 Test
扩展:如果需要绑定的方法要访问实例属性
如果你要绑定的外部方法需要读取实例的x0/x1等属性,可以借助types.MethodType把普通函数绑定为实例方法:
import types def pse_with_self(self): print(f"当前范围是[{self.x0}, {self.x1}]") # 调整__init__逻辑实现绑定 def __init__(self,x0,x1,name,func): self.x0 = x0 self.x1 = x1 self.name = name # 把func绑定为当前实例的方法 self.functions = types.MethodType(func, self)
消除if-else的用法示例
你可以把所有策略实例放到一个列表里,遍历调用即可完全替代分支判断:
if __name__ == '__main__': strategies = [ RangeStrategie(1,9,"Einer",pse), RangeStrategie(10,99,"Zehnner",lambda: print("两位数逻辑")), RangeStrategie(100,999,"Hunderter",lambda: print("三位数逻辑")) ] y = 56 for s in strategies: s.execute(y)
内容的提问来源于stack exchange,提问作者user3586278
相关产品推荐
相关产品推荐

