gpt4 book ai didi

扩展 int 的 Python 类并不完全像 int

转载 作者:太空狗 更新时间:2023-10-29 16:56:52 24 4
gpt4 key购买 nike

在尝试将字符串转换为我编写的扩展 int 的类时,我看到了一些奇怪的行为。这是一个演示我的问题的简单程序:

class MyInt(int):
pass

toInt = '123456789123456789123456789'

print "\nConverting to int..."
print type(int(toInt))

print "\nConverting to MyInt..."
print type(MyInt(toInt))

由于 MyInt 是空的,我希望它的行为与 int 完全一样。相反,这是我从上面的程序中得到的输出:

Converting to int...
<type 'long'>

Converting to MyInt...
Traceback (most recent call last):
File "int.py", line 9, in <module>
print type(MyInt(toInt))
OverflowError: long int too large to convert to int

字符串无法转换为 MyInt!我编写 MyInt 的方式如何导致它的行为与其基类不同?在这种情况下,MyInt 似乎有某种最大值;当在 Python 中扩展内置类时,是否还有其他像这样隐式强加的属性?最后,有没有办法更改 MyInt,使其不再具有此最大值?

最佳答案

secret 就在__new__()方法中:

>>> class MyInt(int): pass
>>> MyInt.__new__ == int.__new__
True
>>> MyInt.__new__(MyInt, '123456789101234567890')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
OverflowError: Python int too large to convert to C long
>>> MyInt.__new__(int, '123456789101234567890')
123456789101234567890L

基本上,当您实例化一个类时,发生的第一件事(在 __init__(self, *args) 之前)是 __new__(cls, *args) 被调用.它被传递给类对象作为它的第一个参数。 int__new__ 方法(由 MyInt 继承)只执行到 long 的转换,如果类传递的是 int。我认为这是为了避免弄乱子类,因为将 MyInt 转换为 long 会删除您添加的所有特殊功能。

如果你想要大于 int 可以处理的整数,你应该使用 long 作为你的基类。

关于扩展 int 的 Python 类并不完全像 int,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10725057/

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