python深入講解魔術(shù)方法
什么是魔術(shù)方法(魔法方法/特殊方法)
- 魔術(shù)方法都不需要手動(dòng)去調(diào)用
- 是在特定的情況下觸發(fā)的
- 魔術(shù)方法都是在python事先定義好的,在定義方法的時(shí)候,不要使用魔術(shù)方法的命名規(guī)范
- 魔術(shù)方法是雙劃線開(kāi)頭,雙劃線結(jié)尾的
一、python內(nèi)置的基本魔術(shù)方法
init方法
init 是類在實(shí)例化時(shí)的方法
# 例如 class Mytest(): def __init__(self): print("----這是魔術(shù)方法__init__") Mytest()
call方法
__call__方法的作用 :實(shí)現(xiàn)對(duì)象可調(diào)用
1.沒(méi)有實(shí)現(xiàn) __call__方法時(shí),對(duì)象是不可以被調(diào)用的
# 類 class Demo: pass # 判斷對(duì)象是否可被調(diào)用,有個(gè)函數(shù)可以使用——callable print(callable(Demo)) ======》 返回True,可被調(diào)用 # demo類創(chuàng)建出來(lái)的對(duì)象是否可被調(diào)用,是不能的被調(diào)用的 obj = Demo() obj()
執(zhí)行結(jié)果:提示:‘Demo’ object is not callable ----- 沒(méi)有__call__方法
2.如果要類創(chuàng)建對(duì)象出來(lái)的對(duì)象可別調(diào)用,就要用到__call__方法
class Demo: def __call__(self, *args,**kwds): print("這是__call__方法執(zhí)行了") print(callable(Demo)) # demo類創(chuàng)建出來(lái)的對(duì)象是否可被調(diào)用(不能被調(diào)用) obj = Demo() obj() # 等同于:obj.__call__() 方法 obj() obj()
new 方法
__new__方法的作用 : 是創(chuàng)建對(duì)象的方法
__init__方法的作用 : 是用來(lái)初始化對(duì)象的方法
類的對(duì)象要能被調(diào)用:
首要new方法創(chuàng)建對(duì)象,然后通過(guò)init方法初始化
什么時(shí)候會(huì)需要用到New方法:
干預(yù)類實(shí)例化對(duì)象的過(guò)程
注意點(diǎn):
- 一般情況不要重寫new方法,除非有特定的需求需要使用new方法來(lái)實(shí)現(xiàn)
- 定義了new方法之后,需要調(diào)用父類的new來(lái)創(chuàng)建對(duì)象 并返回
class MyTest(object): # 初始化對(duì)象 def __init__(self): print('-------init------方法') # 創(chuàng)建對(duì)象 def __new__(cls, *args, **kwargs): print('------new方法-------') obj = super().__new__(cls) # 調(diào)用父類的new來(lái)創(chuàng)建對(duì)象 return obj # 并返回新的對(duì)象 obj = MyTest()
bool(self)方法
定義當(dāng)被 bool() 調(diào)用時(shí)的行為,應(yīng)該返回 True 或 False
class Demo: def __bool__(self): """內(nèi)置函數(shù)bool(),獲取對(duì)象的布爾值是會(huì)執(zhí)行這個(gè)方法""" return True b = Demo() # 獲取對(duì)象的布爾值,返回True 或 False print(bool(b)) =====》 返回 True
str(self)方法
使用print去輸出對(duì)象時(shí),輸出到控制臺(tái)的內(nèi)容是由__str__來(lái)決定的
class Demo: def __str__(self): """ 使用print去輸出對(duì)象時(shí),輸出到控制臺(tái)的內(nèi)容是由__str__來(lái)決定的 """ return 'zifuc' b = Demo() # str方法 s = str('123') print(s) =======》 返回 123
repr(self)方法
這個(gè)方法也是控制對(duì)象顯示的,一般會(huì)顯示對(duì)象的原始信息
class Demo: def __repr__(self): """ 這個(gè)方法也是控制對(duì)象顯示的,一般會(huì)顯示對(duì)象的原始信息 """ return 'repr-number' b = Demo() # repr方法 s = repr('123') print(s) =======》 返回 '123'
len(self)方法
獲取對(duì)象的長(zhǎng)度
class Demo: def __len__(self): """ 這個(gè)方法是獲取對(duì)象的長(zhǎng)度 :return: """ return 3 b = Demo() # 獲取對(duì)象的長(zhǎng)度 print(len(b)) =====》 返回 3
hash(self)方法
返回對(duì)象的hash值
class Demo: def __hash__(self): """ 這個(gè)方法是獲取hash值 :return: """ return 999 b = Demo() # 獲取hash值 print(hash(b)) =====》 返回 999
二、python中容器類型的的魔術(shù)方法
setitem(self, key, value)方法
定義設(shè)置容器中指定元素的行為,語(yǔ)法:self[key] = value
class Mytest: def __setitem__(self, key, value): return setattr(self, key, value) m = Mytest() print(m.__dict__) 沒(méi)有數(shù)據(jù),為空字典 m.name = 'gddg' ==== 》 設(shè)置name屬性,值為gddg m['age'] = 18 ==== 》 設(shè)置age屬性,值為18
getitem(self, item)方法
定義獲取容器中指定元素的行為,語(yǔ)法: self[key]
class Mytest: def __getitem__(self,item): return getattr(self,item) m = Mytest() print(m['name']) ==== 》 name屬性,值為gddg
delitem(self, item)方法
定義刪除容器中指定元素的行為,相當(dāng)于 del self[key]
class Mytest: def __delitem__(self,item): delattr(self,item) m = Mytest() del m['name'] ==== 》 刪除name屬性
contains(self, item)方法
定義當(dāng)使用成員測(cè)試運(yùn)算符(in 或 not in)時(shí)的行為, 返回 True 或 False
class MyTest: def __contains__(self, item): """成員運(yùn)算符觸發(fā)的魔術(shù)方法""" return True a = MyTest() b = MyTest() print(a in b) =======》 返回 True
迭代協(xié)議:__iter__方法
定義當(dāng)?shù)萜髦械脑氐男袨?/p>
class IterClass: def __iter__(self): """ __iter__方法的返回值必須是一個(gè)迭代器 """ return iter([11, 22, 33, 44]) ===== 》返回一個(gè)迭代器 li = IterClass() for i in li : print(i ) for遍歷對(duì)象: 1、執(zhí)行對(duì)象的__iter__方法(返回迭代器) 2、在循環(huán)使用next對(duì)迭代器進(jìn)行迭代
三、python中算數(shù)運(yùn)算符的魔術(shù)方法
add(a,b)方法 和 sub(a,b)方法
a = 1 b = 2 print(a + b) ======》 實(shí)際執(zhí)行的是:a.__add__(a,b) print(a - b) ======》 實(shí)際執(zhí)行的是:a.__sub__(a,b)
字符串類型的是否支持加減的操作
a = '123' b = '12' print(a + b) ======》 實(shí)際執(zhí)行的是:a.__add__(a,b) print(a - b) ======》 實(shí)際執(zhí)行的是:a.__sub__(a,b)
對(duì)字符串對(duì)象沒(méi)有實(shí)現(xiàn)__sub__方法,所以不支持對(duì)象直接使用 -
自己在重新定義__sub__方法,實(shí)現(xiàn)對(duì)字符串對(duì)象的減法
class MyStr(str): def __sub__(self, other): return self.replace(other, '') a = MyStr('1234') b = MyStr('123') print(a + b) ======= 》 返回 1234123 print(a - b) ======= 》 返回 4
到此這篇關(guān)于python深入講解魔術(shù)方法的文章就介紹到這了,更多相關(guān)python魔術(shù)方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python基礎(chǔ)之函數(shù)的定義和調(diào)用
這篇文章主要介紹了python函數(shù)的定義和調(diào)用,實(shí)例分析了Python中返回一個(gè)返回值與多個(gè)返回值的方法,需要的朋友可以參考下2021-10-10Python爬蟲(chóng)自動(dòng)化獲取華圖和粉筆網(wǎng)站的錯(cuò)題(推薦)
這篇文章主要介紹了Python爬蟲(chóng)自動(dòng)化獲取華圖和粉筆網(wǎng)站的錯(cuò)題,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2021-01-01python?matplotlib實(shí)現(xiàn)條形圖的填充效果
這篇文章主要為大家詳細(xì)介紹了python?matplotlib實(shí)現(xiàn)條形圖的填充效果,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04Flask實(shí)現(xiàn)異步執(zhí)行任務(wù)
在一些開(kāi)發(fā)中,可能會(huì)遇到需要長(zhǎng)時(shí)間處理的任務(wù),此時(shí)就需要使用異步的方式來(lái)實(shí)現(xiàn),本文就介紹了Flask實(shí)現(xiàn)異步執(zhí)行任務(wù)的方法,感興趣的可以了解一下2021-05-05tensorflow實(shí)現(xiàn)打印ckpt模型保存下的變量名稱及變量值
今天小編就為大家分享一篇tensorflow實(shí)現(xiàn)打印ckpt模型保存下的變量名稱及變量值,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-01-01使用python 計(jì)算百分位數(shù)實(shí)現(xiàn)數(shù)據(jù)分箱代碼
這篇文章主要介紹了使用python 計(jì)算百分位數(shù)實(shí)現(xiàn)數(shù)據(jù)分箱代碼,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-03-03用Python刪除本地目錄下某一時(shí)間點(diǎn)之前創(chuàng)建的所有文件的實(shí)例
下面小編就為大家分享一篇用Python刪除本地目錄下某一時(shí)間點(diǎn)之前創(chuàng)建的所有文件的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2017-12-12Python OpenCV招商銀行信用卡卡號(hào)識(shí)別的方法
這篇文章主要介紹了Python OpenCV招商銀行信用卡卡號(hào)識(shí)別的方法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2021-03-03Python爬蟲(chóng)實(shí)現(xiàn)爬取百度百科詞條功能實(shí)例
這篇文章主要介紹了Python爬蟲(chóng)實(shí)現(xiàn)爬取百度百科詞條功能,結(jié)合完整實(shí)例形式分析了Python爬蟲(chóng)的基本原理及爬取百度百科詞條的步驟、網(wǎng)頁(yè)下載、解析、數(shù)據(jù)輸出等相關(guān)操作技巧,需要的朋友可以參考下2019-04-04