我需要在Python中动态创建一个类的实例.基本上我使用load_module和inspect模块导入并将类加载到类对象中,但我无法弄清楚如何创建此类对象的实例.
请帮忙!
小智 106
我想出了我带到这个页面的问题的答案.由于没有人真正提出我的问题的答案,我想我会发布它.
class k:
pass
a = k()
k2 = a.__class__
a2 = k2()
Run Code Online (Sandbox Code Playgroud)
此时,a和a2都是同一类(类k)的实例.
jsb*_*eno 17
只需使用三个参数调用内置的"类型",如下所示:
ClassName = type("ClassName", (Base1, Base2,...), classdictionary)
Run Code Online (Sandbox Code Playgroud)
更新 如评论所述,这根本不是这个问题的答案.我将保留它未删除,因为有一些人在这里试图动态创建类 - 这就是上面的行.
要创建一个类的对象,也有一个引用,如在接受的答案中,只需要调用该类:
instance = ClassObject()
Run Code Online (Sandbox Code Playgroud)
因此,实例化的机制是:
Python不使用new某些语言使用的关键字 - 而是它的数据模型解释了在使用与任何其他可调用语法相同的语法调用类时,用于创建类的瞬时的机制:
它的类' __call__方法被调用(在类的情况下,它的类是"元类" - 通常是内置的type).这个调用的正常行为是__new__在被实例化的类上调用(伪)静态方法,然后是它__init__.该__new__方法是负责分配存储器和例如,通常是由完成__new__的object,其是类层次的根.
因此调用ClassObject()所调用ClassObject.__class__.call()(通常会type.__call__)这个__call__方法会收到ClassObject本身作为第一个参数-一个纯Python实现是这样的:(CPython的版本是当然的,在C做的,有很多的额外代码cornercases和优化)
class type:
...
def __call__(cls, *args, **kw):
constructor = getattr(cls, "__new__")
instance = constructor(cls) if constructor is object.__new__ else constructor(cls, *args, **kw)
instance.__init__(cls, *args, **kw)
return instance
Run Code Online (Sandbox Code Playgroud)
(我不记得在文档上看到了将额外参数压缩到根__new__并将其传递给其他类的确切理由(或机制)- 但它是"在现实生活中"发生的事情 - 如果object.__new__使用任何额外参数调用它引发类型错误 - 但是,任何自定义实现__new__都会正常获取额外参数
| 归档时间: |
|
| 查看次数: |
130676 次 |
| 最近记录: |