Skip to main content
 首页 » 编程设计

python之使用字典来控制方法的流程

2025年05月04日18zengkefu

我有一个包含多个方法的类 Population。

根据输入,我希望按给定顺序在类 Population 的实例上运行该方法。

为了更准确地实现我想要实现的目标,与使用类似的东西完全相同:

stuff = input(" enter stuff ") 
 
dico = {'stuff1':functionA, 'stuff2':functionC, 'stuff3':functionB, 'stuff4':functionD} 
 
dico[stuff]() 

除了 functionA、functionB 等...是方法而不是函数:

order_type = 'a' 
class Population (object): 
    def __init__(self,a): 
        self.a = a 
 
    def method1 (self): 
        self.a = self.a*2 
        return self 
 
    def method2 (self): 
        self.a += 2 
        return self 
 
    def method3 (self,b): 
        self.a = self.a + b 
        return self 
 
if order_type=='a': 
    order = {1:method1, 2:method2, 3:method3} 
elif order_type=='b': 
    order = {1:method2, 2:method1, 3:method3} 
else : 
    order = {1:method3, 2:method2, 3:method1} 
 
my_pop = Population(3) 
 
while iteration < 100: 
    iteration +=1 
    for i in range(len(order)): 
        method_to_use = order[i] 
        my_pop.method_to_use() # But obviously it doesn't work! 

希望我已经把我的问题说清楚了! 请注意,我的方法之一需要两个参数

请您参考如下方法:

将实例作为第一个参数显式传递:

method_to_use = order[i] 
method_to_use(my_pop) 

完整的工作代码:

order_type = 'a' 
class Population (object): 
    def __init__(self,a): 
        self.a = a 
 
    def method1 (self): 
        self.a = self.a*2 
        return self 
 
    def method2 (self): 
        self.a += 2 
        return self 
 
    def method3 (self): 
        self.a = 0 
        return self 
 
if order_type=='a': 
    order = [Population.method1, Population.method2, Population.method3] 
elif order_type=='b': 
    order = [Population.method2, Population.method1, Population.method3] 
else : 
    order = [Population.method3, Population.method2, Population.method1] 
 
my_pop = Population(3) 
 
while iteration < 100: 
    iteration +=1 
    for method_to_use in order: 
        method_to_use(my_pop) 

如果要传递多个参数,只需使用*args 语法:

if order_type=='a': 
    order = [Population.method1, Population.method2, Population.method3] 
    arguments = [(), (), (the_argument,)] 
elif order_type=='b': 
    order = [Population.method2, Population.method1, Population.method3] 
    arguments = [(), (), (the_argument,)] 
else : 
    order = [Population.method3, Population.method2, Population.method1] 
    arguments = [(the_argument, ), (), ()] 
 
my_pop = Population(3) 
 
while iteration < 100: 
    iteration +=1 
    for method_to_use, args in zip(order, arguments): 
        method_to_use(my_pop, *args) 

() 是一个空元组,因此 *args 将扩展为没有其他参数,而 (the_argument,) 是一个 1 - 将参数传递给方法的元素元组。