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

107 投票
5 回答
224131 浏览
提问于 2025-04-16 17:12

我需要在Python中动态创建一个类的实例。简单来说,我正在使用load_module和inspect模块来导入并加载这个类到一个类对象中,但我不知道怎么从这个类对象创建一个实例。

5 个回答

2

如果你有一个模块里面有你想要导入的类,可以这样做。

module = __import__(filename)
instance = module.MyClass()

如果你不知道这个类叫什么名字,你可以通过模块里的类来逐个查看。

import inspect
module = __import__(filename)
for c in module.__dict__.values():
    if inspect.isclass(c):
        # You may need do some additional checking to ensure 
        # it's the class you want
        instance = c()
26

只需使用三个参数调用内置的“type”,就像这样:

ClassName = type("ClassName", (Base1, Base2,...), classdictionary)

更新 正如下面评论所说,这根本不是这个问题的答案。我会保持它不被删除,因为有些人可能会在这里找到动态创建类的提示——这就是上面那行代码的作用。

要创建一个已经有引用的类的对象,就像接受的答案中提到的,只需调用这个类:

instance = ClassObject()

实例化的机制如下:

Python不像某些语言那样使用 new 关键字——相反,它的数据模型解释了在调用类时用与其他可调用对象相同的语法来创建类实例的机制:

它的类的 __call__ 方法会被调用(在类的情况下,它的类是“ metaclass”,通常是内置的 type)。这个调用的正常行为是先调用被实例化类的(伪)静态 __new__ 方法,然后是 __init__ 方法。__new__ 方法负责分配内存等,通常是通过 object__new__ 方法来完成的,而 object 是类层次结构的根。

所以调用 ClassObject() 会触发 ClassObject.__class__.call()(通常是 type.__call__),这个 __call__ 方法会将 ClassObject 本身作为第一个参数传入——一个纯 Python 的实现大概是这样的:(当然,cPython 版本是用 C 写的,并且有很多额外的代码来处理边界情况和优化)

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

(我不记得在文档中看到过抑制额外参数传递给根 __new__ 的确切理由(或机制)——但这就是“现实生活”中的情况——如果 object.__new__ 被调用时带有任何额外参数,它会引发类型错误——然而,任何自定义的 __new__ 实现通常会接收到这些额外参数)

178

我找到了我之前在这个页面上提问的答案。因为没有人给出我问题的答案,所以我决定把它分享出来。

class k:
  pass

a = k()
k2 = a.__class__
a2 = k2()

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

撰写回答