59

我有兴趣在 Python 中继承内置int类型(我使用的是 v. 2.5),但是在初始化工作时遇到了一些麻烦。

这是一些示例代码,应该相当明显。

class TestClass(int):
    def __init__(self):
        int.__init__(self, 5)

但是,当我尝试使用它时,我得到:

>>> a = TestClass()
>>> a
0

我希望结果在哪里5

我究竟做错了什么?到目前为止,谷歌并没有太大帮助,但我不确定我应该搜索什么

4

2 回答 2

75

int是不可变的,因此您无法在创建后对其进行修改,请__new__改用

class TestClass(int):
    def __new__(cls, *args, **kwargs):
        return  super(TestClass, cls).__new__(cls, 5)

print TestClass()
于 2010-07-13T14:57:44.253 回答
21

虽然正确,但当前的答案可能并不完整。

例如

a = TestClass()
b = a - 5
print type(b)

将 b 显示为一个整数,您可能希望它是一个 TestClass。

这是一个改进的答案

class positive(int):
    def __new__(cls, value, *args, **kwargs):
        if value < 0:
            raise ValueError("positive types must not be less than zero")
        return  super(cls, cls).__new__(cls, value)

    def __add__(self, other):
        res = super(positive, self).__add__(other)
        return self.__class__(max(res, 0))

    def __sub__(self, other):
        res = super(positive, self).__sub__(other)
        return self.__class__(max(res, 0))

    def __mul__(self, other):
        res = super(positive, self).__mul__(other)
        return self.__class__(max(res, 0))

    def __div__(self, other):
        res = super(positive, self).__div__(other)
        return self.__class__(max(res, 0))

    def __str__(self):
        return "%d" % int(self)

    def __repr__(self):
        return "positive(%d)" % int(self)

现在同样的测试

>>> a = positive(10)
>>> b = a - 9
>>> print(type(b))
<class '__main__.positive'>

更新:
添加了reprstr示例,以便新类可以正确打印。即使 OP 使用 Python 2,也更改为 Python 3 语法以保持相关性。

于 2017-09-13T11:22:20.057 回答