python 算符重载_【python】运算符的重载

什么是运算符重载:

让自定义的类生成的对象(实例)能够使用运算符进行操作

运算符重载的作用:

让自定义的实例像内建对象一样进行运算符操作

让程序简洁易读

对自定义对象将运算符赋予新的规则

算术运算符的重载:

方法名 运算符和表达式 说明

__add__(self,rhs) self + rhs 加法

__sub__(self,rhs) self - rhs 减法

__mul__(self,rhs) self * rhs 乘法

__truediv__(self,rhs) self / rhs 除法

__floordiv__(self,rhs) self //rhs 地板除

__mod__(self,rhs) self % rhs 取模(求余)

__pow__(self,rhs) self **rhs 幂运算

举个栗子:

定义一个二维函数类:用于实现加减乘除等运算。

class Vector2D:

def __init__(self,x,y):

self.x = x

self.y = y

# a + b

def __add__(self, other):

x = self.x + other.x

y = self.y + other.y

return Vector2D(x,y)

def __str__(self):

return "Vector2D(x={},y={})".format(self.x,self.y)

# a - b

def __sub__(self, other):

return Vector2D(self.x - other.x,self.y - other.y)

# a * b

def __mul__(self, other):

return Vector2D(self.x * other.x, self.y * other.y)

# b / b

def __truediv__(self, other):

return Vector2D(self.x / other.x,self.y / other.y)

# a+=b

def __iadd__(self, other):

print("__iadd__")

return self.__add__(other)

# a的绝对值

def __abs__(self):

# return sqrt(self.x ** 2 + self.y ** 2)

return hypot(self.x,self.y)

v1 = Vector2D(2,3)

v2 = Vector2D(3,4)

print(abs(v1))

# len(v1)

v3 = v1 + v2

print(v3)

print(v1 - v2)

print(v1 * v2)

print(v1 / v2)

v1 += v2

print(v1)

输出:

Vector2D(x=5,y=7)

Vector2D(x=-1,y=-1)

Vector2D(x=6,y=12)

Vector2D(x=0.6666666666666666,y=0.75)

__iadd__

内存分析一下:

看图叭,不想多BB...

比较__add__ 、__radd__、__iadd__的区别

(1)如果a有__add__方法,并且返回值不是NotImplemented, 则调用a.__add__(b),然后返回结构

(2)如果a没有__add__方法,或者返回了NotImplemented,检查b有没有__radd__方法,如果有, 且没有返回NotImplemented,则会调用b.__radd__(a),然后返回结果

3)如果b没有__radd__方法,或者调用__radd__返回NotImplemented,抛出错误。

例如:

class A:

def __add__(self, other):

print(type(other))

print("A__add")

return NotImplemented

def __radd__(self, other):

print(type(other))

print("B__add")

class B:

def __radd__(self, other):

print("B_radd")

a = A()

b = B()

a + b

Output:

A__add

B_radd

关于__str__ 与__repr__区别:

(1) __str__不存在的时候,会尝试调用__repr__

(2)__str__是为了让人读;__repr__是为了让机器读

(3)__str__由 print函数 和 str()函数 调用,__repr__是由 repr() 函数调用

class Student:

def __init__(self,name):

self.name = name

def __repr__(self):

return "Student(%r)" % self.name

def __str__(self):

return "name:%s"%self.name

# 创建实例

s = Student("Zurich")

print(s)

str1 = repr(s)

print(str1)

print(eval(str1))

Output:

name:Zurich

Student('Zurich')

name:Zurich

__str__由 print函数 和 str()函数

调用; __repr__是由 repr() 函数调用

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>