淺談Python魔法方法
特殊方法一覽

在 Python 的學(xué)習(xí)和使用過程中, 你一定碰到過一些 特殊方法, 它們開頭和結(jié)尾都有兩條下劃線, 也叫魔法方法 (Magic method), 或者 Dunder method (double under method).
例如:
>>> dir(int) ['__abs__', '__add__', '__and__', '__bool__', '__ceil__', '__len__', '__delattr__', '__dir__', '__divmod__', '__doc__', '__eq__', '__float__', ...]
* Python 的內(nèi)置數(shù)據(jù)類型實(shí)現(xiàn)了非常多的魔法方法, 可以通過 dir() 進(jìn)行查看.
初識(shí)魔法方法
當(dāng)我們想從一個(gè)數(shù)組 nums = [1, 2, 3] 中獲取第一個(gè)元素, 我們知道只需要執(zhí)行 nums[0] 即可, 為了求得 nums[0] 的值, Python 的編譯器實(shí)際上會(huì)隱式調(diào)用 nums.__getitem__(0)
>>> nums = [1, 2, 3] >>> nums[0] 1 >>> nums.__getitem__(0) 1
再例如獲取數(shù)組的長(zhǎng)度, 我們使用 len(nums) 來(lái)獲取, Python 編譯器也是調(diào)用了特殊方法 nums.__len__()
>>> len(nums) 3 >>> nums.__len__() 3
- 特殊方法的存在是給 Python 編譯器隱式調(diào)用的
- 我們自己寫程序的時(shí)候不需要調(diào)用
- 它從規(guī)范上, 不可以自己定義類似 _ _xx_ _ 的方法
魔法方法有什么作用
運(yùn)算符重載
在 Python 中 + 可以對(duì)兩個(gè) int 類型的數(shù)據(jù)進(jìn)行加操作, 也可以對(duì)字符串進(jìn)行拼接, 這都是魔法方法在背后保證了整體語(yǔ)言風(fēng)格的一致性.
魔法方法被大量用在運(yùn)算符重載方面, 比如 +, -, * , /的操作. 我們自己可以定義想要的數(shù)據(jù)結(jié)構(gòu)或者數(shù)據(jù)類型, 這些自定義的class可以跟 Python 內(nèi)置的數(shù)據(jù)類型一樣, 從而可以寫出更具表達(dá)力的代碼, 換句話說就是更具有 Pythonic 風(fēng)格的代碼.
動(dòng)手實(shí)踐
下面我們自定義一個(gè)叫工具人的類, 讓這個(gè)類支持加法, 乘法, 大于等于等操作
class ToolMan(object):
def __init__(self, name, age):
self.name = name
self.age = age
def __len__(self):
return len(self.name)
def __str__(self):
return "你好, 打工人!"
def __add__(self, other):
# 將兩個(gè)ToolMan的年齡加起來(lái)
return self.age + other.age
def __mul__(self, other):
# 將兩個(gè) ToolMan 的年齡相乘
return self.age * other.age
def __ge__(self, other):
# 對(duì)比連個(gè) ToolMan 的年齡
return self.age >= other.age
我們自定義了這樣一個(gè)類, 你可以發(fā)現(xiàn)類中重寫了很多魔法方法, 這些魔法方法可以讓你自定義的類也實(shí)現(xiàn)類似 interger 的加減乘除, 比較大小等操作!
>>> tool_man1 = ToolMan("打工人1", 20)
>>> tool_man2 = ToolMan("打工人2", 25)
>>> print(tool_man1)
你好, 打工人!
>>> tool_man1 + tool_man2
45
>>> tool_man1 * tool_man2
500
>>> tool_man1 >= tool_man2
False
是不是還挺有意思的, 自己動(dòng)手玩一玩吧~
到此這篇關(guān)于淺談Python魔法方法的文章就介紹到這了,更多相關(guān)Python魔法方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
淺談JupyterNotebook導(dǎo)出pdf解決中文的問題
這篇文章主要介紹了淺談JupyterNotebook導(dǎo)出pdf解決中文的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2020-04-04
解決pandas中讀取中文名稱的csv文件報(bào)錯(cuò)的問題
今天小編就為大家分享一篇解決pandas中讀取中文名稱的csv文件報(bào)錯(cuò)的問題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-07-07
Python獲取多進(jìn)程執(zhí)行的返回值實(shí)現(xiàn)
本文主要介紹了Python獲取多進(jìn)程執(zhí)行的返回值實(shí)現(xiàn),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03
在Python中字典按值排序的實(shí)現(xiàn)方法
這篇文章主要介紹了在Python中字典按值排序的實(shí)現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
pyinstaller打包python3.6和PyQt5中各種錯(cuò)誤的解決方案匯總
pyinstaller是打包python很方便的一個(gè)套件,我們可以很輕易地使用他,下面這篇文章主要給大家介紹了關(guān)于pyinstaller打包python3.6和PyQt5中各種錯(cuò)誤解決的相關(guān)資料,需要的朋友可以參考下2022-08-08
python3實(shí)現(xiàn)釘釘消息推送的方法示例
這篇文章主要介紹了python3實(shí)現(xiàn)釘釘消息推送的方法示例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-03-03
Python 創(chuàng)建子進(jìn)程模塊subprocess詳解
這篇文章主要介紹了Python 創(chuàng)建子進(jìn)程模塊subprocess詳解,本文詳細(xì)講解了subprocess模塊的方法、參數(shù)、使用實(shí)例等,需要的朋友可以參考下2015-04-04
Python 一行代碼能實(shí)現(xiàn)喪心病狂的功能
這篇文章主要介紹了Python 一行代碼能實(shí)現(xiàn)喪心病狂的功能,需要的朋友可以參考下2020-01-01
Scrapy-Redis結(jié)合POST請(qǐng)求獲取數(shù)據(jù)的方法示例
這篇文章主要給大家介紹了關(guān)于Scrapy-Redis結(jié)合POST請(qǐng)求獲取數(shù)據(jù)的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Scrapy-Redis具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-05-05
如何基于Python實(shí)現(xiàn)數(shù)字類型轉(zhuǎn)換
這篇文章主要介紹了如何基于Python實(shí)現(xiàn)數(shù)字類型轉(zhuǎn)換,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-02-02

