我正在使用Python在运行时创建一个类,效果很好:
new_class = type("clazz", (object,), {})
globals()["clazz"] = new_class
testobject = clazz()
但是,当我尝试将功能外包给另一个类时,它会失败:
class ClassFactory:
@classmethod
def spawn_class(name):
new_class = type(name, (object,), {})
globals()[name] = new_class
return new_class()
然后,在另一个类中:
ClassFactory.spawn(name="clazz")
testclass = clazz()
错误消息是未定义“ clazz”。我认为这是因为clazz是在不同的模块中生成的,但是即使我通过该模块从
导入所有内容from modules.datahandler.config.class_factory import *
错误消息仍然存在。
答案 0 :(得分:1)
在config_factory.py中定义了以下内容(请注意classmethod
的类应作为第一个arg)
class ClassFactory:
@classmethod
def spawn_class(cls, name):
new_class = type(name, (object,), {})
globals()[name] = new_class
return new_class()
您应该能够动态创建“ clazz”方法,但可以在class_factory模块中使用它。所以您必须导入它才能使用它
>>> from class_factory import ClassFactory
>>> ClassFactory.spawn_class(name="clazz")
<class_factory.clazz object at 0x7f5ad5f2f2d0>
>>>
>>> from class_factory import clazz
>>> testclass = clazz()
答案 1 :(得分:0)
我认为您可能想要的是staticmethod
装饰器,而不是classmethod
装饰器。 classmethod
隐式地将类对象传递给您的方法
class ClassFactory:
@staticmethod
def spawn_class(name):
new_class = type(name, (object,), {})
globals()[name] = new_class
return new_class()
然后在另一个模块中,导入ClassFactory
,您应该可以做到这一点
Classfactory.spawn_new(name="clazz")
testclass = clazz()