我的程序需要根据用户输入选择一个类。
这些类具有相同的方法集(从相同的ABC继承而来(和不同的实现。可能有30多个班。
# myABC.py
class myABC(ABC):
@abstractmethod
def foo():
pass
# A.py
class A(myABC.myABC):
def foo():
print("A")
# B.py
class B(myABC.myABC):
def foo():
print("B")
我脑子里只有一种方法,那就是使用if else。但这显然不是一个伟大的选择超过30如果,elif语句
# main.py
def get_obj(usr_input: str):
if usr_input == "A":
return A.A()
elif usr_input == "B":
return B.B()
...
有其他方法可以解决这个问题吗?非常感谢。
也许动态导入可以帮助您。
#importlib.import_module
您应该确保您的文件名和类名。
然后你可以
import importlib
def get_obj(usr_input: str):
mod = importlib.import_module(usr_input)
usr_class = getattr(mod, usr_input)
return usr_class()
上面假设您的子类的文件名和类名与usr_input
相同
如果您想从主脚本中删除逻辑,您可以创建一个包含实例化所有逻辑的Factory类。
通过这种方式,实例化的逻辑将与主逻辑解耦。
此外,如果您使用的是python 3.10或更高版本,则应该使用match语句,而不是多个if-else