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
是所有共享相同基类的自定义子类,因此对象接受相同的预定义参数集.
调用type(x)
绝对是创建完全相同类型的新实例的规范方法x
.但是,传递给该调用的参数不是给定的,因为"签名"(在调用中传递的参数的数量和类型)随每种不同的类型而变化; 所以,如果你不知道这个类型是什么,你需要更多的内省来实现这个目的(以及一些关于你想要通过的所有参数的规则或启发式,例如,你可以通过从0到3的任何数字,并且可选的/关键字参数名称是'y','z','t'......显然,这里不可能建立一般规则!).
那么,请你澄清一下(一旦实例化的类型是,很容易,确定;-)你将如何解决问题的难点,你甚至没有提到?你可以对类型的签名有什么约束?你是否需要对此进行一些健全性检查,或者只是TypeError
通过使用错误种类或数量的参数进行调用?等等...没有这种性质的更多信息,你的问题不适合证明一个可以在现实世界中实际使用的答案! - )