基本上我希望能够做到这样的事情:
a = Integer(1)
a += 1
print a
当然,打印第二个结果。我需要创建哪些方法才能在我的Integer类中获得此行为?
免责声明:我不打算将其用于“真实”,只是好奇。
答案 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__
。