__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 hands side) 右手邊
示例:
#此例項示意加減乘法
class mynumber:
def __init__(self,value):
self.data = value
def __add__(self,rhs):
return mynumber(self.data+rhs.data)
def __sub__(self,rhs):
return mynumber(self.data-rhs.data)
def __mul__(self,rhs):
return mynumber(self.data*rhs.data)
def __repr__(self):
return '%d' % self.data
n1 = mynumber(100)
n2 = mynumber(200)
n3 = n1+n2
print(n3) #300
練習:
#自定義列表類
class mylist:
def __init__(self,iterable):
self.data = list(iterable)
def __repr__(self):
return 'mylist(%r)' % self.data
def __add__(self,rhs):
l = self.data + rhs.data
return mylist(l)
def __mul__(self,v):
return mylist(self.data*v)
l1 = mylist([1,2,3])
l2 = mylist([4,5,6])
l3 = l1+l2
print(l3)
l4 = l2+l1
print(l4)
l5 = l1*2
print(l5)
出現問題:無法實現 1 + obj
當物件出現在右手邊時要實現反向運算子的過載
__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 冪
注:lhs(left hands side) 左手邊 r-->reverse
__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 冪
注:rhs(right hands side) 右手邊
__lt__(self,rhs) self < rhs 小於
__le__(self,rhs) self <= rhs 小於等於
__gt__(self,rhs) self > rhs 大於
__ge__(self,rhs) self >= rhs 大於等於
注:比較運算子返回true或false
__invert__(self) ~self 取反(一元運算子)
__and__(self,rhs) self&rhs 位與
__or__(self,rhs) self | rhs 位或
__xor__(self,rhs) self ^ rhs 位異或
__lshift__(self,rhs) self<>rhs 右移
__neg__(self) -self 負號
__pos__(self) +self 正號
__invert__(self) ~self 取反
示例:
#此示例示意列表的負號和正號方法過載
class mylist:
def __init__(self,iterable):
self.data = list(iterable)
def __repr__(self):
return 'mylist(%r)' % self.data
def __neg__(self):
l = (-x for x in self.data) #相比於列表表示式
#生成表示式不佔據記憶體
return mylist(l)
def __pos__(self):
l = (abs(x) for x in self.data)
return mylist(l)
l = mylist([1,-2,3,-4])
l1 = -l
l2 = +l
print(l1)
print(l2)
語法:
def __contains__(self,e) e in self
說明:in/not in 都只呼叫__contains__方法
示例:
class mylist:
def __init__(self,iterable):
self.data = list(iterable)
def __contains__(self,e):
for x in self.data:
if e == x:
return true
return false
l = mylist([1,2,3,4])
if -1 in l:
print('-1在l中')
else:
print('-1不在l中')
if -1 not in l:
print('-1不在l中')
__getitem__(self,i) x = self[i] 索引/切片賦值
__setitem__(self,i,v) self[i]=v 索引/切片賦值
__delitem__(self,i) del self[i] del語句刪除索引等
作用:讓自定義的型別和物件能夠支援索引和切片操作 Python 運算子過載
在 python 中is 是兩個運算子,對物件進行比較,分別對id,type value 進行比較。is 比較id type value三維 而 僅 比較value。實驗發現其實is,僅僅是比較一些簡單的基礎變數。class test object def init self self.value ...
Python運算子過載
print 呼叫父類建構函式 def parentmethod self print 呼叫父類方法 def setattr self,attr self.parentattr attr def getattr self print 父類屬性 self.parentattr def del self ...
python 運算子過載
運算子過載就是讓用類寫成的物件,可截獲並響應用在內建型別上的運算 加法,切片,列印和點號運算等 1.以雙下劃線命名的方法 x 的特殊鉤子,python運算子過載的實現是提供特殊命名的方法來攔截運算,python替每種運算和特殊命名的方法之間,定義了固定不變的對映關係 2.當例項出現在內建運算時,這類...