16

尝试将字符串转换为我编写的扩展类时,我看到了一些奇怪的行为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它,使它不再有这个最大值?

4

2 回答 2

13

秘诀在于__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)被调用。它作为第一个参数传递给类对象。(由 继承)的__new__方法仅在其传递的类是时才执行转换为。我认为这是为了避免弄乱子类,因为转换为会删除您添加的所有特殊功能。intMyIntlongintMyIntlong

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

于 2012-05-24T00:27:06.230 回答
1

希望与口译员的这次会议将提供一些关于正在发生的事情的见解:

>>> i = 1
>>> print type(i), i
<type 'int'> 1
>>> i = int((i << 31) - 1)
>>> print type(i), i
<type 'int'> 2147483647
>>> i += 1
>>> print type(i), i
<type 'long'> 2147483648
>>> 

您的类没有继承这种行为,因为 Python 可能将int对象视为一种特殊情况。

于 2012-05-23T18:46:17.757 回答