如何创建与另一个对象相同的类的新实例?

Dav*_*cic 5 python types class instantiation

有一个对象x是的实例一些类如何创建同一类作为一个新的实例x对象,而不导入是所有可能的类在同一个命名空间中,我们要创建同一类型的新对象,并使用isinstance到弄清楚正确的类型.

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

>>> from decimal import Decimal
>>> x = Decimal('3')
>>> x
Decimal('3')
Run Code Online (Sandbox Code Playgroud)

如何创建新的实例Decimal.我认为显而易见的事情是以下两种情况之一:

>>> type(x)('22')
Decimal('22')
>>> x.__class__('22')
Decimal('22')
Run Code Online (Sandbox Code Playgroud)

因为__class__不会工作int例如:

>>> 1.__class__
  File "<stdin>", line 1
    1.__class__
Run Code Online (Sandbox Code Playgroud)

type使用这种方法创建新对象是否是使用此方法的好习惯,还是有其他方法或更多注意事项?

注意:有是现在删除的答案,给了一个正确的方式来获得__class__int.

>>> (1).__class__
<type 'int'>
Run Code Online (Sandbox Code Playgroud)

用例

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

由于我使用的QEvent是所有共享相同基类的自定义子类,因此对象接受相同的预定义参数集.

Ale*_*lli 7

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

那么,请你澄清一下(一旦实例化的类型是,很容易,确定;-)你将如何解决问题的难点,你甚至没有提到?你可以对类型的签名有什么约束?你是否需要对此进行一些健全性检查,或者只是TypeError通过使用错误种类或数量的参数进行调用?等等...没有这种性质的更多信息,你的问题不适合证明一个可以在现实世界中实际使用的答案! - )