以下是该方案:
我有两个班级:
class A:
pass:
class B:
pass
现在我想创建一个客户端,因为我需要一个小的实用工具方法,它应该返回我的类模板/对象,例如:类A,类B,因为我将类名传递给该实用程序,例如{ {1}}。
现在,这可能吗?如果那时请提出一个方法,因为我现在没有在网上得到任何正确答案。
希望我有意义。
答案 0 :(得分:2)
这是一个可能的实现。所有代码都包含在一个'.py'文件中
class A:
pass
class B:
pass
# map class name to class
_classes = {
A.__name__: A,
B.__name__: B,
}
def get_obj(cname):
return _classes[cname]()
# test the function
if __name__ == '__main__':
print get_obj('A')
它将产生以下输出
<__main__.A instance at 0x1026ea950>
答案 1 :(得分:0)
标准库函数namedtuple
创建并返回一个类。在内部,它使用import matplotlib.pyplot as plt
import numpy as np
data = [0,1,2,3,4]
binwidth = 1
plt.hist(data, bins=np.arange(min(data), max(data) + binwidth, binwidth))
plt.xlabel('Time')
plt.ylabel('Counts')
plt.show()
。它可能是你需要的灵感。
源代码:https://github.com/python/cpython/blob/master/Lib/collections/init.py#L356
答案 2 :(得分:0)
globals()
返回一个字典,其中包含在模块的全局范围内定义的所有符号(包括类A
和B
):
a_and_b_module.py
class A: pass
class B: pass
def get_cls(cls_name):
return globals()[cls_name]
如果您正在寻找简洁
如果调用此函数的代码在模块内部,则可以完全取消该函数并直接使用globals()[cls_name]
。
如果调用此函数的代码在模块外部,则可以使用getattr
函数:
a_and_b_module.py
class A: pass
class B: pass
another_file.py
import a_and_b_module
cls_name = 'A'
chosen_cls = getattr(a_and_b_module, cls_name)
如果您正在寻找完全控制
上述方法的问题在于它可以返回 a_and_b_module.py 中定义的任何内容,而不是将自身限制为A
和B
。如果您想确保只能返回A和B:
class A: pass
class B: pass
allowed_classes = ('A', 'B')
def get_cls(cls_name):
assert cls_name in allowed_classes
return globals()[cls_name]
注意:您可能也对factory的概念感兴趣。