Python 運算子過載
常見的運算子過載方法
方法 | 過載 | 呼叫 |
---|---|---|
__init__ |
建構函式 物件建立: | X = Class(args) |
__del_ _ |
解構函式 | X物件收回 |
__add__ |
運算子+ | 如果沒有_iadd_ ,X+Y,X+=Y |
__or__ |
運算子| (位OR ) |
如果沒有_ior_ ,X|Y, X|=Y |
__repr__ ,__str__ |
列印、轉換 | print(X) 、repr(X),str(X) |
__call__ |
函式呼叫 | X(*args,**kargs) |
__getattr__ |
點號運算 | X.undefined |
__setattr__ |
屬性賦值語句 | X.any = value |
__delattr__ |
屬性刪除 | del X.any |
__getattribute__ |
屬性獲取 | X.any |
__getitem__ |
索引運算 | X[key],X[i:j] ,沒__iter__ 時的for 迴圈和其他迭代器 |
__setitem__ |
索引賦值語句 | X[key] = value,X[i:j] = sequence |
__delitem__ |
索引和分片刪除 | del X[key] ,del X[i:j] |
__len__ |
長度 | len(X) ,如果沒有__bool__ ,真值測試 |
__bool__ |
布林測試 | bool(X) ,真測試 |
__lt__ ,__gt__ , |
特定的比較 | X < Y,X > Y |
__le__ ,__ge__ , |
X<=Y,X >= Y |
|
__eq__ ,__ne__ |
X == Y,X != Y |
|
__radd__ |
右側加法 | Other+X |
__iadd__ |
實地(增強的)加法 | X += Y (or else __add__) |
iter,next | 迭代環境 | I = iter(X),next(I) |
__contains__ |
成員關係測試 | item in X (任何可迭代的) |
__index__ |
整數值 | hex(X),bin(X),oct(X),O[X],O[X:] |
__enter__,__exit__ |
環境管理器 | with obj as var: |
__get__,__set__ |
描述符屬性 | X.attr,X.attr = value,del X.attr |
__new__ |
建立 | 在__init__ 之前建立物件 |
對於修改自己的二元操作, 比如 &=
,先__iand__
後__and__
即在找不到__ixx__
的情況下呼叫 __xx__
綜合起來, 在嘗試完了左邊的運算子後, 才能嘗試右邊的運算子
例項如下
In [0]: class A:
...: def __init__(self):
...: self.a =1
...: def __add__(self, b):
...: print('A add')
...:
In [1]: class B:
...: def __init__(self):
...: self.a =1
...: def __iadd__(self, a):
...: print('B iadd')
...:
In [2]: a = A()
In [3]: b =B()
In [4]: a += b
A add
過載二元自操作運算子:
例如
__iand__ &=
__ior__ |=
__ixor__ ^=
__isub__ -=
#etc.
需要
1. self = 新例項
2. return self
例如:
Class OrderedSetAdapter():
# ...
def __ior__(self, other):
self = OrderedSetAdapter(self.__or__(other))
return self
更新操作
只有二元自操作運算子 __ixx__ 才能賦值self 例項 (self = xxxx)
其餘方法更新例項, 只能用方法 clear + update, 建立新例項並直接賦值給self, 會在此方法結束後
失效!!
舉個栗子
class OrderedSet:
# ...
def intersection_update(self, *others):
res = self.intersection(*others)
self.clear()
self.update(res)
def __iand__(self, other):
self = self.__and__(other)
return self
相關推薦
Python——運算子過載(2)
繼續介紹運算子過載的知識。 ======================================================================== 屬性引用:__getattr__和__setattr__ __getattr__方法是攔截屬性點號
Python——運算子過載(1)
運算子過載 關鍵概念: 1.運算子過載讓類攔截常規的Python運算。 2.類可過載所有的Python表示式運算子。 3.類也可過載列印、函式呼叫、屬性點號運算等內建運算。 4.過載使類例項的行為像內建型別。 5.過載是通過特殊名稱的類方法來實現的。 運算子過載只是意味著在
Python 運算子過載
常見的運算子過載方法 方法 過載 呼叫 __init__ 建構函式 物件建立: X = Class(args) __del__ 解構函式 X物件收回 __add__ 運算子+ 如果沒有_i
python運算子過載
剛剛學習python,對於運算子過載,也不是很懂,個人理解如下: 類的專有方法(未截完): ------------------------------------------------------------------------------------------
Python ==運算子過載
在Python中is、==是兩個運算子,對物件進行比較,分別對ID,TYPE,Value進行比較。 "is"比較ID,TYPE,Value三維,而"=="僅比較value。 實驗發現其實is,==僅僅是比較一些簡單的基礎變數。 class Test(object):
Python:Python運算子過載(簡版)
__add__(self, other): + __sub__(self, other): - __mul__(self, other): * __matmul__(self, other): @ __truediv__(self, other): / __floordiv_
Python 看書的一些記錄 運算子過載
1.類和模組有什麼關係? (1)類是模組的一部分,是模組物件的屬性。 (2)類和模組都是名稱空間,但是類是對於語法的。模組是對於檔案的 (3)類支援多個例項,但是模組被匯入時只有一個。 2.什麼是抽象超類(抽象基類)? 抽象超類就是指類的部分行為需要由其子類提供 class
(D20)Python-異常高階,運算子過載
異常(高階) 異常相關的語句: try-except try-finally raise 觸發異常,發生錯誤通知 assert 根據條件觸發AssertionError型別的錯誤通知 with 語句 with語句 語法:
python day18 異常(高階) 一元運算子過載 、 關係運算符的過載 、
目錄: 異常(高階) 一元運算子過載 、 關係運算符的過載 、 with語句 語法: with 表示式1 [as 變數名1], 表示式2 [as 變數名2], ... 作用: 用於對資源訪問的場合,確保使用過程中不管是否發生
python學習筆記22(運算子過載)
運算子過載 不同型別的物件之間的運算子會有不同的解釋,如: print(1 + 2) print("1" + "2") #不同的型別用加法會有不同的解釋 利用運算子過載實現兩個字串數字相加 class Person(object): def __init__(sel
Python的運算子過載 __iter__()和 __next__()
Python語言提供了運算子過載功能,增強了語言的靈活性,這一點與C++有點類似又有些不同。鑑於它的特殊性,今天就來討論一下Python運算子過載。 Python語言本身提供了很多魔法方法,它的運算子過載就是通過重寫這些Python內建魔法方法實現的。
Python一一運算子過載
基礎知識 運算子過載讓類攔截常規的Python運算。 類可過載所有Python表示式運算子。 類也可以過載列印、函式呼叫、屬性點號運算等內建運算。 過載使類例項的行為像內建型別。 過載是通過提供特殊名稱的類
C++運算子過載詳細解說及程式碼編寫
一、不能過載的運算子: (1) "."(類成員訪問運算子) (2)" .*"(類成員指標訪問運算子) (3) "::"(域運算子) (4)"sizeof"(長度運算子) (5) " ?:"(條件運算子)
kotlin運算子過載
//運算子過載定義 //任意類可以定義或者過載父類的基本運算子 //通過運算子的具名函式定義 // //過載運輸符 方法名稱 引數個數要對應 引數型別和返回值可以隨意定義 class Complex(var real:Double,var imaginary:Double){
python - 運算子
#-*- coding:utf-8 -*-# author:jiaxy# datetime:2018/11/3 10:47# software: PyCharm Community Edition# 運算子# 1. 算術運算子# 加減乘除 + - * /# 取模/取餘 % 常用場景:判斷奇偶數a = 1
Python3底層函式重寫和運算子過載
底層函式重寫 Python是支援重寫底層函式的,在列印物件時, &n
(轉)為什麼operator運算子過載一定要為友元函式呢
如果是過載雙目操作符(即為類的成員函式),就只要設定一個引數作為右側運算量,而左側運算量就是物件本身 而 >> 或<< 左側運算量是 cin或cout 而不是物件本身,所以不滿足後面一點,就只能申明為友元函數了 如果一定要宣告為成員函式,只能成為如下的形式:
C++類和物件.四個預設成員函式(賦值運算子過載)
1.(1)類的定義 類就是具有相同資料和相同操作的一組物件的集合。 學生類定義: class student {//成員變數char* name;int age;int sex;//成員函式void speak(){cout<<name<<"年
話運算子過載和友元函式
運算子過載的意義是:將常見的運算子重載出其他的含義:比如將*重載出指標的含義,將<<與cout聯合使用重載出輸出的含義,但需要認識到的問題是:運算子的過載:本質仍然是成員函式,即你可以認為:發生運算子過載時,實際上,是呼叫了成員函式,只不過重新換了個名字,叫運算子過載。 友元函式的意義:使得我們
C++ 運算子過載 運算子屬於左邊的
class A { public: int a; A operator+(const A &a) { A res; res.a = this->a+a.a; return res; } }; int main() { A a1,a2; a1.a = 1;