python 根据参数不同,调用不同的类和方法
1. 使用字典映射类:
创建一个字典,其中键是参数值或参数值对应的字符串,值是对应的类。然后,你可以根据参数从字典中获取类,并创建实例或调用其方法。
class Class1:
def method(self):
print("Class1 method called")
class Class2:
def method(self):
print("Class2 method called")
# 创建类到字典的映射
class_map = {
'class1': Class1,
'class2': Class2,
}
def call_class_method(class_key,method,value):
# 从字典中获取类
Class = class_map.get(class_key)
if Class is not None:
# 创建实例并调用方法
instance = Class()
#instance.method()
getattr(instance,method)(value)
else:
print("Invalid class key")
# 使用函数根据参数调用不同的类方法
call_class_method('class1',"method","123") # 输出: Class1 method called
call_class_method('class2',"method","456") # 输出: Class2 method called
2. 使用工厂函数或方法:
工厂函数或方法可以根据传入的参数返回不同的类实例。这种方法更灵活,允许你在返回实例之前进行额外的逻辑处理。
def create_instance(class_key, *args, **kwargs):
if class_key == 'class1':
return Class1(*args, **kwargs)
elif class_key == 'class2':
return Class2(*args, **kwargs)
else:
raise ValueError("Invalid class key")
# 使用工厂函数创建实例并调用方法
instance = create_instance('class1')
instance.method() # 输出: Class1 method called
3. 使用策略模式:
如果你的类实现了相同的接口(即它们都有相同的方法),你可以使用策略模式。策略模式定义了一系列的算法,并将每一个算法封装起来,使它们可以互相替换。策略模式使得算法可以独立于使用它的客户端变化。
from abc import ABC, abstractmethod
class Strategy(ABC):
@abstractmethod
def execute(self):
pass
class ConcreteStrategyA(Strategy):
def execute(self):
return "Strategy A"
class ConcreteStrategyB(Strategy):
def execute(self):
return "Strategy B"
class Context:
def __init__(self, strategy):
self.strategy = strategy
def set_strategy(self, strategy):
self.strategy = strategy
def execute_strategy(self):
return self.strategy.execute()
# 使用策略模式
context = Context(ConcreteStrategyA())
print(context.execute_strategy()) # 输出: Strategy A
context.set_strategy(ConcreteStrategyB())
print(context.execute_strategy()) # 输出: Strategy B