我有这堂课:
class MetricInt(int):
"""Int wrapper that adds only during the observation window."""
def __new__(cls, _, initial):
return int.__new__(cls, initial)
def __init__(self, sim, initial):
int.__init__(initial)
self.sim = sim
def __add__(self, val):
if self.sim.in_observe_window():
self = MetricInt(self.sim, super(MetricInt, self).__add__(int(val)))
return self
如果__add__
返回self.sim.in_observe_window()
,那么基本上会覆盖True
方法,以便仅添加{。}}。
但是,如果初始值太大,我会OverflowError: Python int too large to convert to C long
。
我正在尝试做什么以及处理大数字的正确方法是什么?
答案 0 :(得分:7)
您使用的是Python 2.6吗?您可以尝试对long
进行子类化。
但总的来说,我强烈建议不要继承Python内置类型; CPython保留跳过对此类型的特殊方法的调用的权利,例如,不会在__str__
的子类上调用str
。你的例子在这里有效,但你可能会要求提出错误。
考虑委派代理,并委托您想要的运算符。 (当然,您可能还需要__int__
。)
答案 1 :(得分:7)
我喜欢Eevee关于委派的回答。他没有提供任何代码,所以我正在这样做:
class MetricInt(object):
"""Int wrapper that adds only during the observation window."""
def __init__(self, sim, initial):
self.sim = sim
self.val = int(initial)
def __add__(self, val):
if self.sim.in_observe_window():
self.val += int(val)
return self
def __int__(self):
return self.val
def __float__(self):
return float(self.val)
这样,问题就解决了。当我决定继承int
类型时,这是因为我的代码中已经有一些int
变量,并且不想过多地更改我的代码。但是,如果我定义__int__
和__float__
,我只需要向int
添加一些强制转换。如果它避免了奇怪的错误,那就不错了。
答案 2 :(得分:2)
我解决了一个类似的问题,用int(bigNumber)将它转换为int,但是认为在你的情况下这是微不足道的。 您可以尝试使用numpy:
numpy.int32(Your big number)
这些我找到的地方现在我记不住了:
def int_overflow(val):
if not -sys.maxint-1 <= val <= sys.maxint:
val = (val + (sys.maxint + 1)) % (2 * (sys.maxint + 1)) - sys.maxint - 1
return val
致作者的信用。
您可以通过此函数传递溢出值并使其标准化。
祝你好运