在Python中创建我自己的“整数”对象

时间:2011-04-09 11:23:33

标签: python object

基本上我希望能够做到这样的事情:

a = Integer(1)
a += 1
print a

当然,打印第二个结果。我需要创建哪些方法才能在我的Integer类中获得此行为?

免责声明:我不打算将其用于“真实”,只是好奇。

7 个答案:

答案 0 :(得分:9)

这是一个简单而不完整的例子。查看方法__sub____div__等等。

class Integer(object):
    def __init__(self, val=0):
        self._val = int(val)
    def __add__(self, val):
        if isinstance(val, Integer):
            return Integer(self._val + val._val)
        return self._val + val
    def __iadd__(self, val):
        self._val += val
        return self
    def __str__(self):
        return str(self._val)
    def __repr__(self):
        return 'Integer(%s)' % self._val

然后

n = Integer()
print n
m = Integer(7)
m+=5
print m

修改已修复__repr__并添加了__iadd__。感谢@Keith指出问题。 编辑修复__add__以允许在整数之间添加。

答案 1 :(得分:7)

首先,快速浏览emulating numeric types上参考手册中的文档。

(不要过于拘泥于此 - 只是为了让您熟悉Python中基于算术运算的方法)

然后参考numbers module的文档,其中包括与模拟不同类型数字最相关的所有抽象基类(例如,numbers.Integral用于自定义整数。)

答案 2 :(得分:3)

您可以使用operator overloading

class Integer:

  def __init__(self, value):
    self.value = value

  def __repr__(self):
    return str(self.value)

  def __add__(self, value):
    self.value += value
    return self

a = Integer(2)
print a

a = a+3
print a

a += 4
print a

答案 3 :(得分:3)

我假设您希望您的Integer类是可变的。为了得到你的例子,这将有效:

class Integer(object):
    def __init__(self, num):
        self._val = num

    def __iadd__(self, other):
        self._val += int(other)

    def __str__(self):
        return str(self._val)

答案 4 :(得分:3)

如果要重载默认的cast-to-string方法的运算符,那么您正在寻找的短语就是“魔术方法”。这些是名为“__<name>__”的方法,并且在直接方法调用之外的情况下由python使用。您可能希望为您的类定义__add____str__方法,以便分别使用第2行和第3行。

值得一提的是,如果您的新类型是左操作数,则将调用__add__方法,并且任何类型都可以作为其参数传递。对于您的右侧操作数的情况,您还应该定义__radd__方法。这适用于所有二元运算符。

有关数字类型的魔术方法的更完整列表,请参阅Emulating Numeric Types

答案 5 :(得分:1)

class Integer(object):

    def __init__(self, value=0):
        self._value = int(value)

    def __add__(self, other):
        if isinstance(other, Integer):
            return Integer(self._value + other._value)
        return Integer(self._value + other)

    def __iadd__(self, other):
        if isinstance(other, Integer):
            self._value += other._value
        else:
            self._value += other
        return self

    def __sub__(self, other):
        if isinstance(other, Integer):
            return Integer(self._value - other._value)
        return Integer(self._value - other)

    def __isub__(self, other):
        if isinstance(other, Integer):
            self._value -= other._value
        else:
            self._value -= other
        return self

    def __mul__(self, other):
        if isinstance(other, Integer):
            return Integer(self._value * other._value)
        return Integer(self._value * other)

    def __div__(self, other):
        if isinstance(other, Integer):
            return Integer(self._value / other._value)
        return Integer(self._value / other)

    def __str__(self):
        return str(self._value)

    def __int__(self):
        return self._value

    def __float__(self):
        return float(self._value)

    def __repr__(self):
        return 'Integer(%s)' % self._value

答案 6 :(得分:0)

试试这个:

class Integer(int):
    def __init__(self, value):
        self.value = value
    # Add extra stuff here.

这将创建一个基于int的类,它负责__repr____iadd____isub__