如何在Python中基于运行时的输入实例化类(实现)



我的程序需要根据用户输入选择一个类

这些类具有相同的方法集(从相同的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

相关内容

  • 没有找到相关文章

最新更新