【问题标题】:How to create a new instance of the same class as the other object?如何创建与另一个对象相同的类的新实例?
【发布时间】:2011-04-14 02:46:14
【问题描述】:

拥有一个对象x,它是一些类的实例,如何创建与x对象相同的类的新实例,而所有可能 em> 类在同一命名空间中,我们要在其中创建相同类型的新对象,并使用isinstance 找出正确的类型。

例如,如果x 是十进制数:

>>> from decimal import Decimal
>>> x = Decimal('3')
>>> x
Decimal('3')

如何创建Decimal 的新实例。我认为显而易见的做法是:

>>> type(x)('22')
Decimal('22')
>>> x.__class__('22')
Decimal('22')

因为__class__ 不能在int 上工作,例如:

>>> 1.__class__
  File "<stdin>", line 1
    1.__class__

使用type 来实现这一点是一种好习惯,还是在使用这种方法创建新对象时有其他一些方法或更多注意事项?

注意: 有一个答案现在已被删除,它提供了获取__class__ of int 的正确方法。

>>> (1).__class__
<type 'int'>

用例

这个问题主要是理论上的,但我现在正在使用这种方法和 Qt 来创建 QEvent 的新实例。例如,由于QEvent 对象被应用程序事件处理程序使用,以便将事件发布到QStateMachine,因此您需要创建事件的新实例,否则您会收到运行时错误,因为底层 C++ 对象被删除。

由于我使用自定义的QEvent 子类,它们都共享相同的基类,因此对象接受相同的预定义参数集。

【问题讨论】:

    标签: python class types instantiation


    【解决方案1】:

    调用type(x) 绝对是创建与x 完全相同类型的新实例的规范方法。但是,传递给该调用的参数不是给定的,因为“签名”(在调用中传递的参数的数量和类型)随每种不同的类型而变化;所以,如果你不知道类型可能是什么,你需要为此目的进行更多的内省(以及一些关于一旦你确定你想要传递的所有参数的规则或启发式,例如,你可以传递从 0 到 3 的任意数字,并且可选/关键字参数名称是 'y'、'z'、't'……显然这里不可能建立 general 规则!)。

    那么,您能否澄清一下(一旦要实例化的类型很容易确定;-)您将如何解决您甚至没有提及的问题的困难部分?您可以对类型的签名假设哪些约束?您是否需要对此进行一些健全性检查,或者通过使用错误类型或数量的参数调用来引发TypeError 是否可以?等等等等...如果没有更多关于这种性质的信息,您的问题就无法证明可以在现实世界中使用的答案!-)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-05-24
      • 2021-04-30
      • 2013-09-13
      • 2014-12-05
      • 1970-01-01
      • 2019-03-26
      • 1970-01-01
      • 2016-08-25
      相关资源
      最近更新 更多