成人国产在线小视频_日韩寡妇人妻调教在线播放_色成人www永久在线观看_2018国产精品久久_亚洲欧美高清在线30p_亚洲少妇综合一区_黄色在线播放国产_亚洲另类技巧小说校园_国产主播xx日韩_a级毛片在线免费

資訊專欄INFORMATION COLUMN

Python基礎(chǔ)之正確重載運(yùn)算符

Scliang / 2424人閱讀

摘要:一運(yùn)算符重載基礎(chǔ)運(yùn)算符重載對(duì)已有的運(yùn)算符進(jìn)行重新定義,賦予其另一種功能,以適應(yīng)不同的數(shù)據(jù)類型。重載一元運(yùn)算符重載一元運(yùn)算符只需實(shí)現(xiàn)相應(yīng)的特殊方法,這些特殊方法只有一個(gè)參數(shù)。

導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之面向?qū)ο笃闹攸c(diǎn)知識(shí)及個(gè)人心得,打算入門(mén)Python的朋友們可以來(lái)一起學(xué)習(xí)并交流。

本文重點(diǎn):

1、掌握運(yùn)算符重載的定義和作用,以及Python對(duì)其的內(nèi)部限制;
2、掌握一元運(yùn)算符重載設(shè)計(jì)思路;
3、理解中綴運(yùn)算符重載過(guò)程中鴨子類型和白鵝類型思想的運(yùn)用并掌握。
一、運(yùn)算符重載基礎(chǔ)

運(yùn)算符重載:對(duì)已有的運(yùn)算符進(jìn)行重新定義,賦予其另一種功能,以適應(yīng)不同的數(shù)據(jù)類型。
重載的作用:令用戶定義的對(duì)象能夠使用中綴運(yùn)算符(如 + 和 | )或一元運(yùn)算符(如 - 和 ~ )等運(yùn)算符。
為了做好靈活性、可用性和安全性方面的平衡,Python對(duì)運(yùn)算符重載施加了一些限制:

不能重載內(nèi)置類型的運(yùn)算符;

能新建運(yùn)算符,只能重載現(xiàn)有運(yùn)算符;

某些運(yùn)算符不能重載,如is、and、or和not(不過(guò)位運(yùn)算符&、| 和 ~可以)。

二、一元運(yùn)算符 1、常見(jiàn)的一元運(yùn)算符

-(__neg__),一元取負(fù)算術(shù)運(yùn)算符。例:若 x 是 -2,則 -x==2。

+(__pos__),一元取正算術(shù)運(yùn)算符。通常x==+x。

~(__invert__),對(duì)整數(shù)按位取反,~x== -(x+1)。例:若 x 是 -2,則 ~x==1。

另外,Python語(yǔ)言參考手冊(cè)將內(nèi)置的abs()函數(shù)列為一元運(yùn)算符,它對(duì)應(yīng)的特殊方法是__abs__。

2、重載一元運(yùn)算符

重載一元運(yùn)算符只需實(shí)現(xiàn)相應(yīng)的特殊方法,這些特殊方法只有self一個(gè)參數(shù)。
重載應(yīng)遵循運(yùn)算符的一個(gè)基本規(guī)則:始終返回一個(gè)新對(duì)象。
即,不能修改self,要?jiǎng)?chuàng)建并返回合適類型的新實(shí)例。

下面我們以第10章的多維向量類為例重載一元運(yùn)算符:

import math
class Vector:
#排版需要省略中間代碼
    def __abs__(self):
        return math.sqrt(sum(x*x for x in self))
    
    def __neg__(self):
        return Vector(-x for x in self)
    
    def __pos__(self):
        return Vector(self)

    def __invert__(self):
        return Vector(-x-1 for x in self)
3、x和+x不相等的情況

算術(shù)運(yùn)算上下文的精度變化可能導(dǎo)致 x 不等于 +x


Python 3.4 為 Decimal 算術(shù)運(yùn)算設(shè)定的默認(rèn)精度是28,這里因?yàn)?x使用上下文的精度導(dǎo)致相等性判斷返回False。

counter實(shí)例不含零值和負(fù)值計(jì)算器


通過(guò)上面的實(shí)例能夠看到counter實(shí)例ct經(jīng)過(guò)零值和負(fù)值的賦值之后,再經(jīng)過(guò)+x運(yùn)算后發(fā)現(xiàn)ct實(shí)例中的非負(fù)數(shù)對(duì)象均消失了。事實(shí)上一元運(yùn)算符 + 等同于加上一個(gè)空 Counter。當(dāng)Counter相加時(shí),Python解釋器從實(shí)用性角度出發(fā)會(huì)把負(fù)值和零值的計(jì)數(shù)從結(jié)果中剔除。

三、中綴運(yùn)算符 1、重載加法__add__

現(xiàn)在我們?nèi)砸缘?0章的多維向量為例進(jìn)行中綴運(yùn)算符加號(hào)“+”的重載。
重載加法的目標(biāo)分析

當(dāng)多維向量類是操作數(shù)時(shí),多維向量應(yīng)支持與同類向量的加法

同時(shí)多維向量類還應(yīng)支持與可迭代對(duì)象的加法;

此外當(dāng)可迭代對(duì)象是操作數(shù)的時(shí)候,多維對(duì)象應(yīng)具備__radd__如此來(lái)調(diào)用多維向量類中的__add__方法。

重載加法的流程圖設(shè)計(jì):
設(shè)計(jì)的重點(diǎn)在于采用鴨子類型思想。當(dāng)多維向量類與非數(shù)值類相加時(shí),多維向量類無(wú)法處理異類加法運(yùn)算可以將加法運(yùn)算交給右操作數(shù)的類處理。因?yàn)橛也僮鲾?shù)存在可以處理這種異類加法的可能。

重載加法的代碼實(shí)現(xiàn):

from itertools import zip_longest
class Vector:
#排版需要省略中間代碼
    def __add__(self, other):
        try:
            return Vector(a+b for a,b in zip_longest(self,other,fillvalue=0))
        except TypeError:
            return NotImplemented
    def __radd__(self, other):
        return self+other

2、重載乘法__mul__
重載加法的目標(biāo)分析

當(dāng)多維向量類是操作數(shù)時(shí),多維向量應(yīng)支持與同類向量的乘法

同時(shí)多維向量類還應(yīng)支持與可迭代對(duì)象的加法;

此外當(dāng)可迭代對(duì)象是操作數(shù)的時(shí)候,多維對(duì)象應(yīng)具備__rmul__如此來(lái)調(diào)用多維向量類中的__mul__方法。

注意:我們對(duì)多維向量重載的乘法是針對(duì)數(shù)論中的實(shí)數(shù)類型進(jìn)行運(yùn)算,此時(shí)可以采用白鵝類型顯式檢查對(duì)象的抽象基類是否為numbers.Real,代碼實(shí)現(xiàn)如下:

import numbers 
class Vector:
#排版需要省略中間代碼
    def __mul__(self, other):
        if isinstance(other,numbers.Real):
                return Vector(x*other for x in self)
        else:
            return NotImplemented
    def __rmul__(self, other):
        return self*other

Tips:一般來(lái)說(shuō)只有當(dāng)處理與self不同類型的操作數(shù)時(shí),需要?jiǎng)?chuàng)建反向方法處理。否則沒(méi)有必要?jiǎng)?chuàng)建反向方法。

四、比較運(yùn)算符

Python 解釋器對(duì)眾多比較運(yùn)算符(==、 !=、 >、 <、 >=、 <=) 的處理與前文類似, 不過(guò)在兩個(gè)方面有重大區(qū)別。

正向和反向調(diào)用使用的是同一系列方法。這方面的規(guī)則如下表所示。例如,對(duì) == 來(lái)說(shuō),正向和反向調(diào)用都是 _eq_ 方法,只是把參數(shù)對(duì)調(diào)了;而正向的 _gt_ 方法調(diào)用的是反向的 __lt__方法, 并把參數(shù)對(duì)調(diào)。

對(duì) == 和 != 來(lái)說(shuō),如果反向調(diào)用失敗,Python 會(huì)比較對(duì)象的 ID,而不拋出 TypeError。

1、重載等號(hào)__eq__

現(xiàn)在我們?nèi)砸缘?0章的多維向量為例進(jìn)行中綴運(yùn)算符等號(hào)“=”的重載。
重載等號(hào)的返回為T(mén)rue的條件

等號(hào)兩端對(duì)象為同類對(duì)象;

等號(hào)兩端對(duì)象中的每個(gè)元素都必須對(duì)應(yīng)相等。

注意:若Vector處理等號(hào)不為T(mén)rue,應(yīng)該返回NotImplemented交由Python處理。如果反向調(diào)用返回 NotImplemented,Python 會(huì)使用后備機(jī)制比較對(duì)象的 ID,作最后一搏。

重載等號(hào)的代碼實(shí)現(xiàn)如下:

class Vector:
#排版需要省略中間代碼
    def __eq__(self, other):
        if isinstance(other,Vector):
            return len(self)==len(other) and all(x==y for x,y in zip(self,other))
        else:
            return NotImplemented
2、了解object中__ne__的實(shí)現(xiàn)
def __ne__(self, other):
    eq_result = self == other
    if eq_result is NotImplemented:
        return NotImplemented
    else:
        return not eq_result
五、增量賦值運(yùn)算符 1、重載加等于__iadd__

現(xiàn)在我們?nèi)砸缘?0章的多維向量為例進(jìn)行中綴運(yùn)算符加等于“+=”的重載。
重載加等于設(shè)計(jì)要求

加等于右側(cè)的對(duì)象與左側(cè)的Vector類是同類對(duì)象或可迭代對(duì)象

否則拋出TypeError,顯示無(wú)法進(jìn)行加等于計(jì)算

下面以BingoCage的子類AddableBingoCage為例實(shí)現(xiàn)__iadd__,大家不必在意這個(gè)子類,重點(diǎn)在于理解__iadd__實(shí)現(xiàn)的思路:

import itertools 
from tombola import Tombola
from bingo import BingoCage
class AddableBingoCage(BingoCage): 
    def __add__(self, other):
        if isinstance(other, Tombola): 
            return AddableBingoCage(self.inspect() + other.inspect()) 
            #self.inspect()繼承自BingoCage,返回當(dāng)前元素組成的有序元組。
        else:
            return NotImplemented
    def __iadd__(self, other):
        if isinstance(other, Tombola):
            other_iterable = other.inspect() 
        else:
            try:
                other_iterable = iter(other)
            except TypeError: 
                self_cls = type(self).__name__
                msg = "right operand in += must be {!r} or an iterable"
                raise TypeError(msg.format(self_cls))
        self.load(other_iterable) 
        return self 

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://systransis.cn/yun/44565.html

相關(guān)文章

  • Python入門(mén)學(xué)習(xí)筆記匯總

    摘要:導(dǎo)語(yǔ)本文章匯總了本人在學(xué)習(xí)基礎(chǔ)之緒論篇數(shù)據(jù)結(jié)構(gòu)篇函數(shù)篇面向?qū)ο笃刂屏鞒唐驮幊唐獙W(xué)習(xí)筆記的鏈接,打算入門(mén)的朋友們可以按需查看并交流。 導(dǎo)語(yǔ):本文章匯總了本人在學(xué)習(xí)Python基礎(chǔ)之緒論篇、數(shù)據(jù)結(jié)構(gòu)篇、函數(shù)篇、面向?qū)ο笃?、控制流程篇和元編程篇學(xué)習(xí)筆記的鏈接,打算入門(mén)Python的朋友們可以按需查看并交流。 第一部分:緒論篇 1、Python數(shù)據(jù)模型 第二部分:數(shù)據(jù)結(jié)構(gòu)篇 2、序列構(gòu)成...

    U2FsdGVkX1x 評(píng)論0 收藏0
  • Python學(xué)習(xí)路20-數(shù)據(jù)模型

    摘要:前言數(shù)據(jù)模型其實(shí)是對(duì)框架的描述,它規(guī)范了這門(mén)語(yǔ)言自身構(gòu)件模塊的接口,這些模塊包括但不限于序列迭代器函數(shù)類和上下文管理器。上述類實(shí)現(xiàn)了方法,它可用于需要布爾值的上下文中等。但多虧了它是特殊方法,我們也可以把用于自定義數(shù)據(jù)類型。 《流暢的Python》筆記。本篇是Python進(jìn)階篇的開(kāi)始。本篇主要是對(duì)Python特殊方法的概述。 1. 前言 數(shù)據(jù)模型其實(shí)是對(duì)Python框架的描述,它規(guī)范了...

    ad6623 評(píng)論0 收藏0
  • [零基礎(chǔ)學(xué)python]模塊的加載

    摘要:找到模塊文件之后,將其編譯成字節(jié)碼,就是那個(gè)文件里面的關(guān)于字節(jié)碼,下面會(huì)介紹,請(qǐng)繼續(xù)閱讀。當(dāng)然,如果根本就沒(méi)有找到同名的源文件,只有字節(jié)碼文件,那么就只能運(yùn)行這個(gè)了。執(zhí)行就是前面已經(jīng)編譯的模塊字節(jié)碼文件,順理成章要執(zhí)行了。 不管是用import還是用from mmmm import *的方式導(dǎo)入模塊,當(dāng)程序運(yùn)行之后,回頭在看那個(gè)存儲(chǔ)著mmmm.py文件的目錄中(關(guān)于mmmm.py文件可...

    tinylcy 評(píng)論0 收藏0
  • Python數(shù)據(jù)模型

    摘要:本文重點(diǎn)了解數(shù)據(jù)模型和接口的概念掌握特殊方法的定義,作用和基本用法。一基本概念數(shù)據(jù)模型是數(shù)據(jù)特征的抽象,這里是對(duì)框架的描述。數(shù)據(jù)模型規(guī)范了自身構(gòu)建模塊的接口,模塊包括但不限于序列迭代器函數(shù)類和上下文管理器。 導(dǎo)語(yǔ):本文章記錄了本人在學(xué)習(xí)Python基礎(chǔ)之緒論篇的重點(diǎn)知識(shí)及個(gè)人心得,以加深自己的理解。 本文重點(diǎn): 1、了解Python數(shù)據(jù)模型和接口的概念;2、掌握特殊方法的定義,作用和基...

    Flink_China 評(píng)論0 收藏0
  • [零基礎(chǔ)學(xué)python]重回函數(shù)

    摘要:函數(shù)的基本結(jié)構(gòu)中的函數(shù)基本結(jié)構(gòu)函數(shù)名參數(shù)列表語(yǔ)句幾點(diǎn)說(shuō)明函數(shù)名的命名規(guī)則要符合中的命名要求。在中,將這種依賴關(guān)系,稱之為多態(tài)。不要期待在原處修改的函數(shù)會(huì)返回結(jié)果比如一定要之用括號(hào)調(diào)用函數(shù)不要在導(dǎo)入和重載中使用擴(kuò)展名或路徑。 在本教程的開(kāi)始部分,就已經(jīng)引入了函數(shù)的概念:《永遠(yuǎn)強(qiáng)大的函數(shù)》,之所以那時(shí)候就提到函數(shù),是因?yàn)槲矣X(jué)得函數(shù)之重要,遠(yuǎn)遠(yuǎn)超過(guò)一般。這里,重回函數(shù),一是復(fù)習(xí),二是要在已經(jīng)...

    dmlllll 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<