最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

一文帶你了解Python中的雙下方法

 更新時間:2022年07月14日 10:51:08   作者:程序員小六  
Python中有一些特殊方法的方法名都是以雙下劃線開始和結(jié)束,所以又被稱為雙下方法。本文就來為大家詳細(xì)講講Python中的雙下方法的使用,感興趣的可以了解一下

前言

大家在寫 Python 代碼的時候有沒有這樣的疑問。

為什么數(shù)學(xué)中的+號,在字符串運(yùn)算中卻變成拼接功能,如'ab' + 'cd'結(jié)果為abcd;而*號變成了重復(fù)功能,如'ab' * 2結(jié)果為abab。

為什么某些對象print能輸出數(shù)據(jù),而print自定義的類對象卻輸出一堆看不懂的代碼<__main__.MyCls object at 0x105732250>。

不是因為系統(tǒng)做了特殊定制,而是 Python 中有一類特殊的方法,在某些特定的場合會自動調(diào)用。如,在字符串類str中定義了__add__方法后,當(dāng)代碼遇到字符串相加'ab' + 'cd'時,就會自動調(diào)用__add__方法完成字符串拼接。

因為這類特殊方法的方法名都是以雙下劃線開始和結(jié)束,所以又被稱為雙下方法。

Python 中的雙下方法很多,今天我們對它做個詳解。

Python中的雙下方法

1. init方法

__init__的方法是很多人接觸的第一個雙下方法。

class?A:
????def?__init__(self,?a):
????????self.a?=?a

當(dāng)調(diào)用A()實例化對象的時候,__init__方法會被自動調(diào)用,完成對象的初始化。

2. 運(yùn)算符的雙下方法

在類中定義運(yùn)算符相關(guān)的雙下方法,可以直接在類對象上做加減乘除、比較等操作。

這里,定義一個尺子類Rule,它包含一個屬性r_len代表尺子的長度。

class?Rule:
????def?__init__(self,?r_len):
????????self.r_len?=?r_len

2.1 比較運(yùn)算符

如果想按照尺子的長度對不同的尺子做比較,需要在Rule類中定義比較運(yùn)算符。

class?Rule:
????def?__init__(self,?r_len):
????????self.r_len?=?r_len

????#?<?運(yùn)算符
????def?__lt__(self,?other):
????????return?self.r_len?<?other.r_len

????#?<=?運(yùn)算符
????def?__le__(self,?other):
????????return?self.r_len?<=?other.r_len

????#?>?運(yùn)算符
????def?__gt__(self,?other):
????????return?self.r_len?>?other.r_len

????#?>=?運(yùn)算符
????def?__ge__(self,?other):
????????return?self.r_len?>=?other.r_len

這里定義了<、<=、>>=四個比較運(yùn)算符,這樣就可以用下面的代碼比較Rule對象了。

rule1?=?Rule(10)
rule2?=?Rule(5)
print(rule1?>?rule2)??#?True
print(rule1?>=?rule2)??#?True
print(rule1?<?rule2)??#?False
print(rule1?<=?rule2)??#?False

當(dāng)用>比較rule1rule2的時候,rule1對象會自動調(diào)用__gt__方法,并將rule2對象傳給other參數(shù),完成比較。

下面是比較運(yùn)算符的雙下方法

比較運(yùn)算符雙下方法

2.2 算術(shù)運(yùn)算符

可以支持類對象加減乘除。

def?__add__(self,?other):
????return?Rule(self.r_len?+?other.r_len)

這里定義了__add__方法,對應(yīng)的是+運(yùn)算符,他會把兩個尺子的長度相加,并生成新的尺子。

rule1?=?Rule(10)
rule2?=?Rule(5)
rule3?=?rule1?+?rule2

下面是算術(shù)運(yùn)算符的雙下方法

2.3 反向算術(shù)運(yùn)算符

它支持其他類型的變量與Rule類相加。以__radd__方法為例

def?__radd__(self,?other):
????return?self.r_len?+?other
rule1?=?Rule(10)
rule2?=?10?+?rule1

程序執(zhí)行10 + rule1時,會嘗試調(diào)用int類的__add__int類類沒有定義與Rule類對象相加的方法,所以程序會調(diào)用+號右邊對象rule1__radd__方法,并把10傳給other參數(shù)。

所以這種運(yùn)算符又叫右加運(yùn)算符。它所支持的運(yùn)算符與上面的算術(shù)運(yùn)算符一樣,方法名前加r即可。

2.4 增量賦值運(yùn)算符

增量賦值運(yùn)算符是+=、-=*=、/=等。

def?__iadd__(self,?other):
????self.r_len?+=?other
????return?self
rule1?=?Rule(10)
rule1?+=?5

除了__divmod__方法,其他的跟算數(shù)運(yùn)算符一樣,方面名前都加i。

2.4 位運(yùn)算符

這部分支持按二進(jìn)制進(jìn)行取反、移位和與或非等運(yùn)算。由于Rule類不涉及位運(yùn)算,所以我們換一個例子。

定義二進(jìn)制字符串的類BinStr,包含bin_str屬性,表示二進(jìn)制字符串。

class?BinStr:
????def?__init__(self,?bin_str):
????????self.bin_str?=?bin_str
x?=?BinStr('1010')??#創(chuàng)建二進(jìn)制字符串對象
print(x.bin_str)?#?1010

BinStr定義一個取反運(yùn)算符~

#?~?運(yùn)算符
def?__invert__(self):
????inverted_bin_str?=?''.join(['1'?if?i?==?'0'?else?'0'?for?i?in?self.bin_str])
????return?BinStr(inverted_bin_str)

__invert__方法中,遍歷bin_str字符串,將每位取反,并返回一個新的BinStr類對象。

x?=?BinStr('1011')

invert_x?=?~x
print(invert_x.bin_str)?#?0100

下面是位運(yùn)算符的雙下方法

這部分也支持反向位運(yùn)算符和增量賦值位運(yùn)算符,規(guī)則跟算數(shù)運(yùn)算符一樣,這里就不再贅述。

3.字符串表示

這部分涉及兩個雙下方法__repr____format__,在某些特殊場景,如print,會自動調(diào)用,將對象轉(zhuǎn)成字符串。

還是以BinStr為例,先寫__repr__方法。

def?__repr__(self):
????decimal?=?int('0b'+self.bin_str,?2)
????return?f'二進(jìn)制字符串:{self.bin_str},對應(yīng)的十進(jìn)制數(shù)字:{decimal}'
x?=?BinStr('1011')
print(x)
#?輸出:二進(jìn)制字符串:1011,對應(yīng)的十進(jìn)制數(shù)字:11

當(dāng)程序執(zhí)行print(x)時,會自動調(diào)用__repr__方法,獲取對象x對應(yīng)的字符串。

再寫__format__方法,它也是將對象格式化為字符串。

def?__format__(self,?format_spec):
????return?format_spec?%?self.bin_str
print('{0:二進(jìn)制字符串:%s}'.format(x))
#?輸出:二進(jìn)制字符串:1011

當(dāng).format方法的前面字符串里包含0:時,就會自動調(diào)用__format__方法,并將字符串傳給format_spec參數(shù)。

4.數(shù)值轉(zhuǎn)換

調(diào)用int(obj)、float(obj)等方法,可以將對象轉(zhuǎn)成相對應(yīng)數(shù)據(jù)類型的數(shù)據(jù)。

def?__int__(self):
????return?int('0b'+self.bin_str,?2)
x?=?BinStr('1011')
print(int(x))

當(dāng)調(diào)用int(x)時,會自動調(diào)用__int__方法,將二進(jìn)制字符串轉(zhuǎn)成十進(jìn)制數(shù)字。

數(shù)值轉(zhuǎn)換除了上面的兩個外,還有__abs__、__bool____complex__、__hash____index____str__。

__str____repr__一樣,在print時都會被自動調(diào)用,但__str__優(yōu)先級更高。

5.集合相關(guān)的雙下方法

這部分可以像集合那樣,定義對象長度、獲取某個位置元素、切片等方法。

__len____getitem__為例

def?__len__(self):
????return?len(self.bin_str)

def?__getitem__(self,?item):
????return?self.bin_str[item]
x?=?BinStr('1011')

print(len(x))??#?4
print(x[0])??#?1
print(x[0:3])??#?101

len(x)會自動調(diào)用__len__返回對象的長度。

通過[]方式獲取對象的元素時,會自動調(diào)用__getitem__方法,并將切片對象傳給item參數(shù),即可以獲取單個元素,還可以獲取切片。

集合相關(guān)的雙下方法還包括__setitem____delitem____contains__。

6.迭代相關(guān)的雙下方法

可以在對象上使用for-in遍歷。

def?__iter__(self):
????self.cur_i?=?-1
????return?self

def?__next__(self):
????self.cur_i?+=?1
????if?self.cur_i?>=?len(self.bin_str):
????????raise?StopIteration()??#?退出迭代
????return?self.bin_str[self.cur_i]
x?=?BinStr('1011')
for?i?in?x:
????print(i)

當(dāng)在x上使用for-in循環(huán)時,會先調(diào)用__iter__方法將游標(biāo)cur_i置為初始值-1,然后不斷調(diào)用__next__方法遍歷self.bin_str中的每一位。

這部分還有一個__reversed__方法用來反轉(zhuǎn)對象。

def?__reversed__(self):
????return?BinStr(''.join(list(reversed(self.bin_str))))
x?=?BinStr('1011')
reversed_x?=?reversed(x)
print(reversed_x)
#?輸出:二進(jìn)制字符串:1101,對應(yīng)的十進(jìn)制數(shù)字:13

7.類相關(guān)的雙下方法

做 web 開發(fā)的朋友,用類相關(guān)的雙下方法會更多一些。

7.1 實例的創(chuàng)建和銷毀

實例的創(chuàng)建是__new____init__方法,實例的銷毀是__del__方法。

__new__的調(diào)用早于__init__,它的作用是創(chuàng)建對象的實例(內(nèi)存開辟一段空間),而后才將該實例傳給__init__方法,完成實例的初始化。

由于__new__是類靜態(tài)方法,因此它可以控制對象的創(chuàng)建,從而實現(xiàn)單例模式。

__del__方法在實例銷毀時,被自動調(diào)用,可以用來做一些清理工作和資源釋放的工作。

7.2 屬性管理

類屬性的訪問和設(shè)置。包括__getattr__、__getattribute____setattr____delattr__方法。

__getattr____getattribute__的區(qū)別是,當(dāng)訪問類屬性時,無論屬性存不存在都會調(diào)用__getattribute__方法,只有當(dāng)屬性不存在時才會調(diào)用__getattr__方法。

7.3 屬性描述符

控制屬性的訪問,一般用于把屬性的取值控制在合理范圍內(nèi)。包括__get__、__set____delete__方法。

class?XValidation:
????def?__get__(self,?instance,?owner):
????????return?self.x

????def?__set__(self,?instance,?value):
????????if?0?<=?value?<=?100:
????????????self.x?=?value
????????else:
????????????raise?Exception('x不能小于0,不能大于100')

????def?__delete__(self,?instance):
????????print('刪除屬性')


class?MyCls:
????x?=?XValidation()

????def?__init__(self,?n):
????????self.x?=?n

obj?=?MyCls(10)
obj.x?=?101
print(obj.x)?#?拋異常:Exception: x不能小于0,不能大于100

上述例子,通過類屬性描述符,可以將屬性x的取值控制在[0, 100]之前,防止不合法的取值。

8.總結(jié)

雖然上面介紹的不是所有的雙下方法,但也算是絕大多數(shù)了。

雖然雙下方法里可以編寫任意代碼,但大家盡量編寫與方法要求一樣的代碼。如,在__add__方法實現(xiàn)的不是對象相加而是相減,雖然也能運(yùn)行,但這樣會造成很大困惑,不利于代碼維護(hù)。

到此這篇關(guān)于一文帶你了解Python中的雙下方法的文章就介紹到這了,更多相關(guān)Python雙下方法內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Django logging配置及使用詳解

    Django logging配置及使用詳解

    這篇文章主要介紹了Django logging配置及使用詳解,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下
    2019-07-07
  • python scrapy腳本報錯問題及解決

    python scrapy腳本報錯問題及解決

    這篇文章主要介紹了python scrapy腳本報錯問題及解決,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教
    2024-02-02
  • python操作excel的方法(xlsxwriter包的使用)

    python操作excel的方法(xlsxwriter包的使用)

    這篇文章主要為大家詳細(xì)介紹了python操作excel的方法,xlsxwriter包的使用方法,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-06-06
  • 使用python-Jenkins批量創(chuàng)建及修改jobs操作

    使用python-Jenkins批量創(chuàng)建及修改jobs操作

    這篇文章主要介紹了使用python-Jenkins批量創(chuàng)建及修改jobs操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-05-05
  • 利用python實現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式

    利用python實現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式

    今天小編就為大家分享一篇利用python實現(xiàn).dcm格式圖像轉(zhuǎn)為.jpg格式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python查找算法之分塊查找算法的實現(xiàn)

    Python查找算法之分塊查找算法的實現(xiàn)

    這篇文章主要介紹了Python查找算法之分塊查找算法的實現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧
    2021-04-04
  • Python最常用的20 個包總結(jié)

    Python最常用的20 個包總結(jié)

    這篇文章主要介紹了Python最常用的20 個包總結(jié),在平時使用Python的過程中,需要用到很多有用的包,今天就來盤點(diǎn)一下常用的包,需要的朋友可以參考下
    2023-04-04
  • pycharm下打開、執(zhí)行并調(diào)試scrapy爬蟲程序的方法

    pycharm下打開、執(zhí)行并調(diào)試scrapy爬蟲程序的方法

    本篇文章主要介紹了pycharm下打開、執(zhí)行并調(diào)試scrapy爬蟲程序的方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-11-11
  • Python操作Word批量生成文章的方法

    Python操作Word批量生成文章的方法

    這篇文章主要介紹了Python操作Word批量生成文章的方法,需要的朋友可以參考下
    2015-07-07
  • python實現(xiàn)中文文本分句的例子

    python實現(xiàn)中文文本分句的例子

    今天小編就為大家分享一篇python實現(xiàn)中文文本分句的例子,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2019-07-07

最新評論

政和县| 栾川县| 彝良县| 全南县| 麟游县| 长子县| 安徽省| 武安市| 什邡市| 凤城市| 财经| 新闻| 漳浦县| 仙桃市| 新沂市| 山东省| 昌平区| 克山县| 大丰市| 姚安县| 将乐县| 瓦房店市| 阿克苏市| 郸城县| 嘉黎县| 南投县| 黑山县| 沅江市| 和顺县| 丹东市| 荣成市| 吕梁市| 佛冈县| 自贡市| 旬邑县| 扎鲁特旗| 荣成市| 修文县| 杭锦旗| 顺平县| 寻乌县|