什么是运算符重载
让自定义的类生成的对象(实例)能够使用运算符进行操作
作用:
让自定义的实例像内建对象一样进行运算符操作
让程序简洁易读
对自定义对象将运算符赋予新的规则
算术运算符的重载:
方法名 运算符和表达式 说明
__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 幂运算
示例:
rhs(right hand side) 右手边
说明:
运算符重载的方法的参数已经有了固定的含义,不建议改变原有的运算符的含义及参数的意义
二元运算符的重载方法格式:
def __xx__(self,other):
语句块
练习:
实现两个自定义列表的相加
class Mylist:
def __init__(self,iterable=()):
self.data = list(iterable)
L1 = MyList([1,2,3])
L2 = MyList([4,5,6])
L3 = L1+L2
print(L3) #MyList([1,2,3,4,5,6])
L4 = L2 + L3
print(L4) #MyList([4,5,6,1,2,3])
#试想能否实现以下操作
L5 = L1 * 3
print(L5) #MyList([1,2,3,1,2,3,1,2,3])
反向运算符的重载
当运算符的左侧为内建类型时,右侧为自定义类型进行算术匀算符运算时会出现TypeError错误,因为无法修改内建类型的代码 实现运算符重载,此时需要使用反向运算符的重载
反向算术运算符的重载:
方法名 运算符和表达式 说明
__radd__(self,lhs) lhs + self 加法
__rsub__(self,lhs) lhs - self 减法
__rmul__(self,lhs) lhs * self 乘法
__rtruediv__(self,lhs) lhs / self 除法
__rfloordiv__(self,lhs) lhs // self 地板除
__rmod__(self,lhs) lhs % self 取模(求余)
__rpow__(self,lhs) lhs ** self 幂运算
示例:
复合赋值算术运算符的重载
以复合赋值算术运算符 x += y为例,此运算符会优先调用x.__iadd__(y)方法,如果没有__iadd__方法时,则会将复合赋值算术运 算拆解为:x = x + y
然后调用x = x.__add__(y)方法,如果再不存在__add__方法则会触发TypeError类型的错误异常
复合赋值算术运算符的重载:
方法名 运算符和表达式 说明
__iadd__(self,rhs) self += rhs 加法
__isub__(self,rhs) self -= rhs 减法
__imul__(self,rhs) self *= rhs 乘法
__itruediv__(self,rhs) self /= rhs 除法
__ifloordiv__(self,rhs) self //=rhs 地板除
__imod__(self,rhs) self %= rhs 取模(求余)
__ipow__(self,rhs) self **=rhs 幂运算
比较算术运算符的重载
比较算术运算符的重载:
方法名 运算符和表达式 说明
__lt__(self,rhs) self < rhs 小于
__le__(self,rhs) self rhs 大于
__ge__(self,rhs) self >= rhs 大于等于
__eq__(self,rhs) self == rhs 等于
__ne__(self,rhs) self != rhs 不等于
位运算符重载
方法名 运算符和表达式 说明
__and__(self,rhs) self & rhs 位与
__or__(self,rhs) self | rhs 位或
__xor__(self,rhs) self ^ rhs 位异或
__lshift__(self,rhs) self >rhs 右移
反向位运算符重载
方法名 运算符和表达式 说明
__and__(self,lhs) lhs & rhs 位与
__or__(self,lhs) lhs | rhs 位或
__xor__(self,lhs) lhs ^ rhs 位异或
__lshift__(self,lhs) lhs >rhs 右移
复合赋值位相关运算符重载
方法名 运算符和表达式 说明
__iand__(self,rhs) self & rhs 位与
__ior__(self,rhs) self | rhs 位或
__ixor__(self,rhs) self ^ rhs 位异或
__ilshift__(self,rhs) self >rhs 右移
一元运算符的重载
方法名 运算符和表达式 说明
__neg__(self) - self 负号
__pos__(self) + self 正号
__invert__(self) ~ self 取反
语法:
class 类名:
def __xxx__(self):
pass
示例见:
in/not in 运算符重载
格式:
def __contains__(self,e):
语句
注: in / not in 返回布尔值 True / False
当重载了__contains__后,in和not in运算符都可用
not in 运算符的返回值与 in相反
示例:
方法名 运算符和表达式 说明
__getitem__(self,i) x = self(i) 索引/切片取值
__setitem__(self,i,v) self[i] = v 索引/切片赋值
__delitem__(self,i) del self[i] del语句删除索引/切片
作用:
让自定义的类型的对象能够支持索引和切片操作
示例:
class Mylist:
def __init__(self, iterable=()):
self.__data = list(iterable)
def __repr__(self):
return 'Mylist(%s)' % self.__data
def __getitem__(self, i):
'索引取值,i绑定[]内的元素'
print('i的值', i)
return self.__data[i] # 返回data绑定列表中的第i个元素
def __setitem__(self, i, v):
'''此方法可以让自定义的列表支持索引赋值操作'''
print('__setitem__被调用,i = ', i, 'v = ', v)
self.__data[i] = v
def __delitem__(self, i):
del self.__data[i] # self.__data.pop(i)
return self
if type(i) is int:
print('用户正在用索引取值')
elif type(i) is slice:
print('用户正在用切片取值')
print('切片的起点是:', i.start)
print('切片的终点是:', i.stop)
print('切片的步长是:', i.step)
elif type(i) is str:
print('用户正在用字符串进行索引操作')
# raise KeyError
return self.__data[i] # 返回data绑定的第i个元素
l1 = Mylist([1, 2, 3, 4, -5, 6])
print(l1[3]) # 4
l1[3] = 400
print(l1) # Mylist([1, 2, 3, 400, -5, 6])
del l1[3]
print(l1) # Mylist([1, 2, 3, -5, 6])
print(l1[::2]) # [1,3,6]
slice构造函数
作用:
用于创建一个slice对象,此对于用于切片操作的传值
格式:
slice(start = None,stop = None ,step = None)
slice对象的实例属性:
start 切片的起始值,默认为None
stop 切片的终止值,默认为None
step 切片的步长,默认为None
特性属性@property
实现其他语言所拥有的getter和setter功能
作用:
用来模拟一个属性
通过@property装饰器,可以对模拟属性的赋值和取值加以控制
示例:
这里有我自己整理了一套最新的python系统学习教程java二元运算符,包括从基础的python脚本到web开发、爬虫、数据分析、数据可视化、机器学习等。想要这些资料的可以关注小年java二元运算符,并在后台私信小年:“01”即可领取。
———END———
限 时 特 惠:本站每日持续更新海量各大内部创业教程,一年会员只需128元,全站资源免费下载点击查看详情
站 长 微 信:jiumai99
2.本站所有项目来源于投稿或购买自其他第三方,若本站侵犯了您的权益请 联系站长 进行删除处理。