python如何在模块中注册动态类

mno*_*tka 12 python module metaprogramming class

我有模块foo,在这个模块里面我动态创建了类:

def superClassCreator():
    return type("Bar", (object,), {})
Run Code Online (Sandbox Code Playgroud)

现在,我想要实现的是使这个新的动态类作为这个模块的一个类可见:

import foo
dir(foo)
>>> [... 'Bar' ...]
Run Code Online (Sandbox Code Playgroud)

你知道怎么做吗?

Mar*_*ers 18

您可以使用Bar = superClassCreator()foo(在模块级).

或者,从另一个模块,您可以添加Bar为属性foo:

import foo

foo.Bar = superClassCreator()
Run Code Online (Sandbox Code Playgroud)

或者,如果必须从生成的类中取名:

import foo

generatedClass = superClassCreator()
setattr(foo, generatedClass.__name__, generatedClass)
Run Code Online (Sandbox Code Playgroud)

foo模块中,您可以直接在globals()以下位置设置:

generatedClass = superClassCreator()
globals()[generatedClass.__name__] = generatedClass
del generatedClass
Run Code Online (Sandbox Code Playgroud)

使用可选del语句generatedClass再次从命名空间中删除名称.

  • 如果名称是动态生成的怎么办?在那种情况下你不能这样做。 (2认同)
  • @mnowotka:那行不通,你需要在`sys.modules` 中查找模块。使用`setattr(sys.modules[generatedClass.__module__],generatedClass.__name__,generatedClass)`。请注意,`__module__` 将成为定义 `superClassCreator()` 的模块。 (2认同)
  • @mnowotka:你可以*设置*__module__`属性,顺便说一句.你也可以在'dict`参数中为`type()`提供一个`__module__`键.所以'type('Bar',(object,),{'__ modle __':'foo.baz'})`.我已经验证了`type()`的C源代码,它从当前的全局变量中获取了`__name__`.所以这是你的Django外壳. (2认同)