如何在Python中从类对象创建新实例

ycs*_*tle 64 python oop

我需要在Python中动态创建一个类的实例.基本上我使用load_module和inspect模块导入并将类加载到类对象中,但我无法弄清楚如何创建此类对象的实例.

请帮忙!

小智 106

我想出了我带到这个页面的问题的答案.由于没有人真正提出我的问题的答案,我想我会发布它.

class k:
  pass

a = k()
k2 = a.__class__
a2 = k2()
Run Code Online (Sandbox Code Playgroud)

此时,a和a2都是同一类(类k)的实例.

  • `k2` 是对象类型,在本例中是 `a` 的类型(`a.__class`),`k2()` 创建一个独立于 `a` 的该类型对象的新实例。`k2 = k` 只会创建对同一实例的新引用。 (3认同)
  • 这似乎是正确的答案.工作而且很简单. (2认同)
  • 您还可以使用“k2 = type(a)”获取“class”对象,然后调用该类对象“a2 = k2()”。本质上是一样的,但你不必在代码中乱扔那些丑陋的双下划线……可能也更便携 (2认同)

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__都会正常获取额外参数

  • OP是不是想创建一个实例,而不是一个类? (8认同)