我想将带有可用类的dict传递给函数,以便我可以使用它们的名称构造它们,而无需导入它们。
我的想法是这样做:
from construct_classes import construct_classes
class A:
def __init__(self):
print('A')
class B:
def __init__(self):
print('B')
if __name__ == '__main__':
construct_classes({'A': A, 'B': B})
在construct_classes.py中:
def construct_classes(my_classes):
a = my_classes['A'].__init__(my_classes['A'])
b = my_classes['B'].__init__(my_classes['B'])
这似乎有效,但对我来说看起来很丑陋。
有没有反对使用它的论据,如果有,还有另一种方法可以实现这种行为吗?
答案 0 :(得分:0)
根据我对你的问题的看法,这就是我的想法:
如果它看起来很丑陋,也许就是这样。但也可能因为__init__
调用而发生了downvotes(遵循Klaus评论修正)。
我不记得使用像“插件地图”或“插件字典”这样的表达,尽管我们知道这样的生物可以存在。现在,如果你说“已安装的插件列表”,那么另外一件事,如果你看到我的意思......
如果您只是想在不触及某些类代码的情况下添加功能,请使用Decorator模式(即Python装饰器)。
如果要为用户或客户端代码构建插件列表以供选择和运行,则需要抽象出一个用于插件管理和使用的通用API。这样您就可以从使用.list()
获得的列表中进行选择,或者迭代列表,例如.run()
中的任何一个。
同时检查命名空间包。不要认为它直接适用于此,但插件似乎主要是名称管理问题,也许你可以用不同的方式构建插件的想法,然后充分利用它。它们只是具有通用名称且没有__init__.py
的子文件夹,将其中定义的名称/模块放入一个共同的顶级名称。