Python类与整数仿真

7
以下是一个示例:

给定以下示例:

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继承,但这次尝试不成功。
更新:
如果你想使用__init__,从int继承会失败。
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


1
我不理解你的问题。你如何绕过必须做的一件事情,以便不去做你必须要做的那件事情?打鱼也不能忘掉打鱼! - Jonathan Feinberg
我想要一个类像一个整数一样运作。实际整数的实现总是相同的,所以为什么每次使用它都要重新实现呢?当你使用“+”操作符进行除了真正的加法之外的其他操作时,__add__方法是有意义的。 - Günther Jena
请记住,由于整数是不可变的,一旦创建了整数,您将无法更改整数的“self”值! - Raphael
3个回答

7
在Python 2.4及以上版本中,继承自int是可行的:
class MyInt(int):pass
f=MyInt(3)
assert f + 5 == 8

我在使用构造函数(__init__)的命名参数时遇到了问题。当我调用f=MyInt(other_argument=True)时,它会失败(TypeError: 'other_argument'是此函数的无效关键字参数)。 - Günther Jena
1
@Günther Jehle:请将此内容添加到您的问题中。该评论与您的问题不符,并且在此问题的背景下没有太多意义。请更新问题以包含所有事实。 - S.Lott
添加了从int继承的结果。 - Günther Jena

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中统一类型和类 中找到。


2

尽量使用最新版本的Python。您的代码可以在2.6.1中运行。


我的Python版本目前是2.5.1。 - Günther Jena
等等,为什么你要继承自 object?如果你从 int 继承的话,代码是可以工作的。 - jdb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接