python 運算子過載

2021-09-22 22:39:48 字數 3880 閱讀 2949

__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.當例項出現在內建運算時,這類...