Python类整数仿真(Python Class with integer emulation)

2019-09-01 23:59发布

由于是下面的例子:

class Foo(object):
    def __init__(self, value=0):
        self.value=value

    def __int__(self):
        return self.value

我想有一个类Foo,其作为一个整数(或浮动)。 所以,我想要做以下的事情:

f=Foo(3)
print int(f)+5 # is working
print f+5 # TypeError: unsupported operand type(s) for +: 'Foo' and 'int'

第一条语句print int(f)+5工作,原因有两个整数。 第二个是失败的,因为我要实现__add__做这个手术我的同班同学。

因此,要实现整数的行为,我要实现所有的整数模拟方法。 我怎么能解决这个问题。 我试图从继承int ,但这种尝试并不成功。

更新

继承int失败,如果你想使用__init__

class Foo(int):
    def __init__(self, some_argument=None, value=0):
        self.value=value
        # do some stuff

    def __int__(self):
        return int(self.value)

如果再拨打:

f=Foo(some_argument=3)

你得到:

TypeError: 'some_argument' is an invalid keyword argument for this function

与Python 2.5和2.6进行测试

Answer 1:

你需要重写__new__ ,不__init__

class Foo(int):
    def __new__(cls, some_argument=None, value=0):
        i = int.__new__(cls, value)
        i._some_argument = some_argument
        return i

    def print_some_argument(self):
        print self._some_argument

现在,按照预期的课堂作业:

>>> f = Foo(some_argument="I am a customized int", value=10)
>>> f
10
>>> f + 8
18
>>> f * 0.25
2.5
>>> f.print_some_argument()
I am a customized int

有关覆盖的更多信息new中可以找到统一类型和类在Python 2.2 。



Answer 2:

在Python 2.4及以上的从int作品继承:

class MyInt(int):pass
f=MyInt(3)
assert f + 5 == 8


Answer 3:

尝试使用Python的先进的最新版本。 你的代码在2.6.1。



文章来源: Python Class with integer emulation