6

给出了以下示例:

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 测试

4

3 回答 3

7

在 Python 2.4+ 中,继承自 int 工作:

class MyInt(int):pass
f=MyInt(3)
assert f + 5 == 8
于 2009-10-28T16:14:38.083 回答
6

您需要覆盖__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 中的类型和类

于 2009-11-24T18:44:15.057 回答
2

尝试使用最新版本的 python。您的代码适用于 2.6.1。

于 2009-10-28T16:16:48.877 回答