在一个类中对特殊操作符的进行重新定义之后,这个类的实例关于这个操作符的运算就可以根据类中定义的方法进行操作。这种对操作符的重新定义也被称为操作符的重载。
在python中,一些内置方法通过双下划线开始和结束定义。在下面的Python代码中定义了类wow,并对操作符“-,+”以及方法”repr“进行了重载。根据重载的定义,之后实例a,b,c间会以wow类中重新定义的操作符方法进行运算。
class wow():
def __init__(s,x):
s.x = x
def __add__(s,y):
return wow(s.x+y.x)
def __sub__(s,y):
return wow(s.x-y.x)
def __repr__(s):
return str(s.x)
a=wow(5)
b=wow(7)
c=wow(3)
res=a-b+c
print(res)
以加法为例,在不对操作符进行重载的情况下,程序是不能实现两个wow实例的直接相加的。对“+”进行了重定义后,这时,在对wow实例进行“+”操作相当于对实例中的两个数据进行加法运算,最后,在将wow输出的数据以wow实例的形式输出(return wow(s.x+y.x)
)。
通过以上的说明,可以理解重载的概念。但还有点疑问,为什么使用__repr__呢,既然是字符串转换,那为什么不可以是__str__呢?所以有必要分析一下str与r__repr__的区别。
1,什么时候调用__str__?
情况1:在使用print时,首先调用__str__。
2,什么时候调用__repr__?
情况1:使用print时,如果__str__没有被定义,会调用__repr__。关于repr
情况2:在终端中,读取python运行内存中的数据。
可以通过下面两个例子区分str,repr。
`class wow(object):
def __init__(s,a):
s.x = a
def __str__(s):
return str(s.x)
a=wow(5)`
在shell中输入上面的python程序,
如果在shell中输入print(a),结果为
5
说明print调用了__str__。
如果直接输a,结果为
“<main.wow object at 0x7fa93c00e2e8>”;
说明终端读取运行内存中的变量a时,不能调用__str__。
如果把上面python程序的__str__改成__repr__,即
` def __repr__(s):
return str(s.x)`
此时无论直接输入a,或者输入print(a),结果都是5。
说明在没有__str__的情况下,print调用了__repr__,并且终端读取运行内存中的变量a时也能调用__str__。
总结:
和__str__一样,使用__repr__也是为了将对象中的数据转换成字符串类型。在使用print函数时,第一选择是__str__,第二选择是__repr__。但__repr__还可以在终端读取python运行内存中的数据。