Python中類的運算子過載

2022-07-20 10:36:09 字數 3344 閱讀 2079

這篇文章僅僅是總結性質的,待以後有時間的時候會針對比較難理解的部分補充一些例子。

__init__

__del__

__call__

__str__

__repr__

str(x), print(x):會先嘗試__str__方法,然後嘗試__repr__方法;repr(x)或互動模式下輸入x,只會嘗試__repr__方法。

__getattr__:只有類中沒有定義的屬性點號運算才會嘗試該方法

__setattr__:類中所有屬性的賦值語句都會嘗試該方法,self.attr=val會變成self.setattr('attr',val)

__delattr__

__getattribute__:類中所有屬性的點號運算都會嘗試該方法

__getitem__

__setitem__

__delitem__

__iter__

__next__

在所有的迭代環境中,會先嘗試__iter__方法,然後在嘗試__getitem__方法,但是注意迭代器根本沒有過載索引表示式,所以如果需要通過while來根據下標手工迭代,那麼需要定義__getitem__方法。

__contains__

in成員測試會先嘗試__contains__方法,然後是__iter__方法,最後是__getitem__方法。

__get__

__set__

delete

主要這裡是__delete__,也析構函式__del__是完全不同的。

__lt__

__le__

__gt__

__ge__

__eq__: !=和==都會嘗試該方法,所以需要確保兩個運算子都正確地作用。

請看下面的例項:

class x:

def __init__(self, value):

self.data = value

def __eq__(self, value):

return self.data == value

x = x(4)

print(x ==5)

print(x != 5)

結果為

false

true

__add__,__iadd__,__radd__

__sub__,__isub__,__rsub__

__mul__,__imul__:乘法

__neg__,__pos__:表示-obj, +obj

__abs__

__floordiv__,__ifloordiv__,__truediv__,__itruediv__

__mod__,__imod__,__imod__

__pow__,__ipow__

a += b會嘗試增強加法__iadd__,然後嘗試普通加法__add__

x = b + obj:如果b不是類例項時,會呼叫右側加法__radd__

當我們把兩個例項相加的時候,python執行__add__,它反過來通過簡化左邊的運算數來觸發__radd__

__concat__:比如序列a,b的加法a+b

__iconcat__

__and__,__iand__

__or__,__ior__,__xor__,__ixor__

__inv__,__invert__: ~obj

__lshift__,__ilshift__,__rshift__,__irshift__

a &=b:會先嘗試__iand__,然後嘗試__add__

__bool__

__len__

布林測試會先嘗試乙個特定的__bool__方法,然後在嘗試__len__方法。在python2.6中使用的名稱不是__bool__,而是__nonzero__

主要是用於with語句的上下文管理。

__enter__

__exit__

__new__

這個函式會在類初始化函式__init__()之前呼叫

__index__

如果在bin(x), hex(x), oct(x), o[x], o[x:]等需要傳入乙個數字、索引、分片的值時傳入乙個物件,那麼該物件的__index__會被呼叫。

主要是用來替代python2.x中的__oct____hex__

運算子過載 類的賦值運算子過載

下面介紹類的賦值運算子 1.c 中物件的記憶體分配方式 在c 中,物件的例項在編譯的時候,就需要為其分配記憶體大小,因此,系統都是在stack上為其分配記憶體的。這一點和c 完全不同!千 萬記住 在c 中,所有類都是reference type,要建立類的實體,必須通過new在heap上為其分配空間...

運算子類過載

類過載格式 函式型別 operator 運算子名稱 形參表 型引數 使用引數 1 使用 號實現複數相加 不使用類過載 include using namespace std class complex complex double r,double i complex complex add com...

python中的運算子過載

學過c 的都知道我們在類中可以對運算子進行過載,以使運算子實現自己所需要的功能 自然在python中也可以實現運算子的過載 方法名 過載的操作說明 呼叫表示式 init 建構函式 建立物件 class del 析構函式 釋放物件的時候 add x y or x y repr 列印,轉換 print ...