拥有一个对象x
,它是某些类的一个实例,如何创建与x
对象相同的类的新实例,而不导入我们想要在同一名称空间中创建相同类型的新对象并使用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__
int
的正确方法。
>>> (1).__class__
<type 'int'>
用例
问题主要是理论问题,但我现在正在使用这种方法与Qt一起创建QEvent
的新实例。例如,由于应用程序事件处理程序使用QEvent
对象以便将事件发布到QStateMachine
,因此您需要创建事件的新实例,否则会因为底层C ++对象而出现运行时错误被删除。
由于我使用的是所有共享相同基类的自定义QEvent
子类,因此对象接受相同的预定义参数集。
答案 0 :(得分:6)
调用type(x)
绝对是创建与x
完全相同类型的新实例的规范方法。但是,传递给该调用的参数不是给定的,因为“签名”(在调用中传递的参数的数量和类型)随每种不同的类型而变化;所以,如果你不知道这个类型是什么,你需要更多的内省来实现这个目的(以及一些关于你想要通过的所有参数的规则或启发式,例如,你可以通过从0到3的任何数字,并且可选的/关键字参数名称是'y','z','t'......显然,这里不可能建立通用规则!)。< / p>
那么,你能澄清一下(一旦实例化的类型是,很容易,确定;-)你将如何解决问题的难点,你甚至没有提到?你可以对类型的签名有什么约束?你是否需要对此进行一些健全性检查,或者通过使用错误的种类或数量的参数调用TypeError
是否可以?等等...没有这种性质的更多信息,你的问题本身并不能证明在现实世界中实际上使用的答案! - )