1. 程式人生 > >Python 運算子過載

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):

PythonPython運算子過載(簡版)

__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;