python運算子過載程式設計 ne 怎麼用

2021-10-17 00:09:13 字數 4874 閱讀 3150

這篇文章主要介紹了python運算子過載詳解及例項**的相關資料,需要的朋友可以參考下

python運算子過載

python語言提供了運算子過載功能,增強了語言的靈活性,這一點與c++有點類似又有些不同。鑑於它的特殊性,今天就來討論一下python運算子過載。

python語言本身提供了很多魔法方法,它的運算子過載就是通過重寫這些python內建魔法方法實現的。這些魔法方法都是以雙下劃線開頭和結尾的,類似於x的形式,python通過這種特殊的命名方式來攔截操作符,以實現過載。當python的內建操作運用於類物件時,python會去搜尋並呼叫物件中指定的方法完成操作。

類可以過載加減運算、列印、函式呼叫、索引等內建運算,運算子過載使我們的物件的行為與內建物件的一樣。python在呼叫操作符時會自動呼叫這樣的方法,例如,如果類實現了add方法,當類的物件出現在+運算子中時會呼叫這個方法。

常見運算子過載方法方法名過載說明運算子呼叫方式

init建構函式物件建立: x = class(args)

del析構函式x物件收回

add/sub加減運算x+y, x+=y/x-y, x-=y

or運算子|x|y, x|=y

_repr/str列印/轉換print(x)、repr(x)/str(x)

call函式呼叫x(*args, **kwargs)

getattr屬性引用x.undefined

setattr屬性賦值x.any=value

delattr屬性刪除del x.any

getattribute屬性獲取x.any

getitem索引運算x[key],x[i:j]

setitem索引賦值x[key],x[i:j]=sequence

delitem索引和分片刪除del x[key],del x[i:j]

len長度len(x)

bool布林測試bool(x)

lt, gt,

le, ge,

eq, ne特定的比較依次為xy,x<=y,x>=y,

x==y,x!=y

注釋:(lt: less than, gt: greater than,

le: less equal, ge: greater equal,

eq: equal, ne: not equal

radd右側加法other+x

iadd實地(增強的)加法x+=y(or else add)

iter, next迭代i=iter(x), next()

contains成員關係測試item in x(x為任何可迭代物件)

index整數值hex(x), bin(x), oct(x)

enter, exit環境管理器with obj as var:

get, set,

delete描述符屬性x.attr, x.attr=value, del x.attr

new建立在init之前建立物件

下面對常用的運算子方法的使用進行一下介紹。

建構函式和析構函式:init和del

它們的主要作用是進行物件的建立和**,當例項建立時,就會呼叫init構造方法。當例項物件被收回時,析構函式del會自動執行。>>> class human():

... def init(self, n):

... self.name = n

... print("init ",self.name)

... def del(self):

... print("del")

>>> h = human('tim')

init tim

>>> h = 'a'

del加減運算:add和sub

過載這兩個方法就可以在普通的物件上新增+-運算子操作。下面的**演示了如何使用+-運算子,如果將**中的sub方法去掉,再呼叫減號運算子就會出錯。>>> class computation():

... def init(self,value):

... self.value = value

... def add(self,other):

... return self.value + other

... def sub(self,other):

... return self.value - other

>>> c = computation(5)

>>> c + 5

>>> c - 3

物件的字串表達形式:repr和str

這兩個方法都是用來表示物件的字串表達形式:print()、str()方法會呼叫到str方法,print()、str()和repr()方法會呼叫repr方法。從下面的例子可以看出,當兩個方法同時定義時,python會優先搜尋並呼叫str方法。>>> class str(object):

... def str(self):

... return "str called"

... def repr(self):

... return "repr called"

>>> s = str()

>>> print(s)

str called

>>> repr(s)

'repr called'

>>> str(s)

'str called'

索引取值和賦值:getitem, setitem

通過實現這兩個方法,可以通過諸如 x[i] 的形式對物件進行取值和賦值,還可以對物件使用切片操作。>>> class indexer:

data = [1,2,3,4,5,6]

def getitem(self,index):

return self.data[index]

def setitem(self,k,v):

self.data[k] = v

print(self.data)

>>> i = indexer()

>>> i[0]

>>> i[1:4]

[2, 3, 4]

>>> i[0]=10

[10, 2, 3, 4, 5, 6]

設定和訪問屬性:getattr、setattr

我們可以通過過載getattr和setattr來攔截對物件成員的訪問。getattr在訪問物件中不存在的成員時會自動呼叫。setattr方法用於在初始化物件成員的時候呼叫,即在設定dict的item時就會呼叫setattr方法。具體例子如下:class a():

def init(self,ax,bx):

self.a = ax

self.b = bx

def f(self):

print (self.dict)

def getattr(self,name):

print ("getattr")

def setattr(self,name,value):

print ("setattr")

self.dict[name] = value

a = a(1,2)

a.f()

a.xa.x = 3

a.f()

上面**的執行結果如下,從結果可以看出,訪問不存在的變數x時會呼叫getattr方法;當init被呼叫的時候,賦值運算也會呼叫setattr方法。setattr

setattr

getattr

setattr

迭代器物件: iter, next

python中的迭代,可以直接通過過載getitem方法來實現,看下面的例子。

>>> class indexer:

... data = [1,2,3,4,5,6]

... def getitem(self,index):

... return self.data[index]

>>> x = indexer()

>>> for item in x:

... print(item)

通過上面的方法是可以實現迭代,但並不是最好的方式。python的迭代操作會優先嘗試呼叫iter方法,再嘗試getitem。迭代環境是通過iter去嘗試尋找iter方法來實現,而這種方法返回乙個迭代器物件。如果這個方法已經提供,python會重複呼叫迭代器物件的next()方法,直到發生stopiteration異常。如果沒有找到iter,python才會嘗試使用getitem機制。下面看一下迭代器的例子。

class next(object):

def init(self, data=1):

self.data = data

def iter(self):

return self

def next(self):

print("next called")

if self.data > 5:

raise stopiteration

else:

self.data += 1

return self.data

for i in next(3):

print(i)

print("-----------")

n = next(3)

i = iter(n)

while true:

try:

print(next(i))

except exception as e:

break

程式的執行結果如下:next called

next called

next called

next called

next called

next called

next called

next called

可見實現了iter和next方法後,可以通過for in的方式迭代遍歷物件,也可以通過iter()和next()方法迭代遍歷物件。

3. python基礎入門教程

python運算子過載程式設計 ne 怎麼用

在python語言中提供了類似於c 的運算子重在功能 一下為python運算子重在呼叫的方法如下 method overloads call for init 建構函式 x class del 析構函式 物件銷毀 add x y,x y or x y,x y repr 列印轉換 print x,re...

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 ...