gpt4 book ai didi

python - 如何创建与其他对象相同的类的新实例?

转载 作者:太空狗 更新时间:2023-10-30 02:35:16 25 4
gpt4 key购买 nike

有一个对象 x,它是 some 类的实例如何创建与 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 来实现这个是好的做法,还是在使用这种方法创建新对象时有其他一些方法或更多注意事项?

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

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

用例

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

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

最佳答案

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

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

关于python - 如何创建与其他对象相同的类的新实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3742111/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com