动态创建类时出现NameError

时间:2019-07-19 20:53:35

标签: python

我正在使用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 *

错误消息仍然存在。

2 个答案:

答案 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()