python入門系列:魔法函數

引言

魔法函數是Python中定義的赵颅,以__開頭,__結尾,形如__fun__()的函數饺谬,一般使用已經定義好了的即可。

使用這樣一些函數递胧,可以讓我們自定義的類有更加強大的特性。

魔法函數一般是隱式調用的赡茸,不需要我們顯示調用缎脾。

class Language(object):

def __init__(self, language_list):

self.lans = language_list

# 如果要遍歷所有的語言,可以:

language = Language(["Python", "C", "Lisp"])

for lan in language.lans:

print(lan)

# result:

# Python

# C

# Lisp

用魔法函數也可實現上面的功能占卧,而且使用起來會更加簡潔遗菠。

class Language(object):

# 沒錯,這也是一個魔法函數华蜒,現在先不關注它

def __init__(self, language_list):

self.lans = language_list

# 定義這樣一個魔法函數

def __getitem__(self, item):

return self.lans[item]

language = Language(["Python", "C", "Lisp"])

for lan in language:

print(lan)

# result:

# Python

# C

# Lisp

魔法函數對Python的影響

魔法函數不屬于定義它的那個類辙纬,只是增強了類的一些功能。

實現了特定的魔法函數之后叭喜,某些操作會變得特別簡單贺拣。

我們可以采用實現魔法函數來靈活地設計我們需要的類。

常用魔法函數

后續(xù)學習會介紹一部分捂蕴,這里了解即可纵柿。

非數學運算

字符串表示

__repr__()

__str__()

集合、序列

__len__()

__getitem__()

__setitem__()

__delitem__()

__contains__()

迭代相關

__iter__()

__next__()

可調用

__call__()

with上下文管理器

__enter__()

__exit__()

數值轉換

__abs__()

__bool__()

__int__()

__float__()

__hash__()

__index__()

元類相關

__new__()

__init__()

屬性相關

__getattr__(), __setattr__()

__getattribute__(), __setattribute__()

__dir__()

屬性描述符

__get__(), __set__(), __delete__()

攜程

__await__(), __aiter__(), __anext__(), __aenter__(), __aexit__()

數學運算

看一個例子就行了启绰,因為:

運算方式復雜

實際應用不多

# 實現一個二維向量的加法計算

class Vector(object):

def __init__(self, x, y):

self.x = x

self.y = y

def __add__(self, v):

res_v = Vector(self.x + v.x, self.y + v.y)

return res_v

def __str__(self):

return "x: {0}, y: {1}".format(self.x, self.y)

first_vector = Vector(1, 2)

second_vector = Vector(3, 4)

print(first_vector + second_vector)

# result:

# x: 4, y: 6

以len()為例

引言

len()函數可以返回一個序列的長度

首先該類型要定義了__len__()方法

原理

當我們使用len()函數獲取一些內置對象(list, tuple, set...)的長度時昂儒,性能會非常高,因為這些內置對象使用C語言實現的委可,同時該方法并未對內置對象進行遍歷獲得長度渊跋,而是內置對象維護了一個長度屬性,調用方法后着倾,直接進行屬性值的讀取即可拾酝。

結論

某些方法并未我們想象中的那么簡單,內部實現時會做很多優(yōu)化卡者。

盡量使用Python的內置對象蒿囤,和內置的一些函數,提高效率崇决。

小結

魔法函數使得自定義的類型會具有神奇的功能材诽,讓我們可以設計更加靈活的類型,它將我們自定義的類型和一些內建類型建立起了關聯恒傻,明白了更加底層的一些細節(jié)脸侥,為后面的的深入學習做了一個鋪墊。

注:喜歡python + qun:839383765 可以獲取Python各類免費最新入門學習資料盈厘!

?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末睁枕,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子,更是在濱河造成了極大的恐慌外遇,老刑警劉巖注簿,帶你破解...
    沈念sama閱讀 221,635評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異跳仿,居然都是意外死亡诡渴,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 94,543評論 3 399
  • 文/潘曉璐 我一進店門塔嬉,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人租悄,你說我怎么就攤上這事谨究。” “怎么了泣棋?”我有些...
    開封第一講書人閱讀 168,083評論 0 360
  • 文/不壞的土叔 我叫張陵胶哲,是天一觀的道長。 經常有香客問我潭辈,道長鸯屿,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 59,640評論 1 296
  • 正文 為了忘掉前任把敢,我火速辦了婚禮寄摆,結果婚禮上,老公的妹妹穿的比我還像新娘修赞。我一直安慰自己婶恼,他們只是感情好,可當我...
    茶點故事閱讀 68,640評論 6 397
  • 文/花漫 我一把揭開白布柏副。 她就那樣靜靜地躺著勾邦,像睡著了一般。 火紅的嫁衣襯著肌膚如雪割择。 梳的紋絲不亂的頭發(fā)上眷篇,一...
    開封第一講書人閱讀 52,262評論 1 308
  • 那天,我揣著相機與錄音荔泳,去河邊找鬼蕉饼。 笑死,一個胖子當著我的面吹牛玛歌,可吹牛的內容都是我干的椎椰。 我是一名探鬼主播,決...
    沈念sama閱讀 40,833評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼沾鳄,長吁一口氣:“原來是場噩夢啊……” “哼慨飘!你這毒婦竟也來了?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,736評論 0 276
  • 序言:老撾萬榮一對情侶失蹤瓤的,失蹤者是張志新(化名)和其女友劉穎休弃,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體圈膏,經...
    沈念sama閱讀 46,280評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡塔猾,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,369評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了稽坤。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片丈甸。...
    茶點故事閱讀 40,503評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖尿褪,靈堂內的尸體忽然破棺而出睦擂,到底是詐尸還是另有隱情,我是刑警寧澤杖玲,帶...
    沈念sama閱讀 36,185評論 5 350
  • 正文 年R本政府宣布顿仇,位于F島的核電站,受9級特大地震影響摆马,放射性物質發(fā)生泄漏臼闻。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點故事閱讀 41,870評論 3 333
  • 文/蒙蒙 一囤采、第九天 我趴在偏房一處隱蔽的房頂上張望述呐。 院中可真熱鬧,春花似錦蕉毯、人聲如沸市埋。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽缤谎。三九已至,卻和暖如春褐着,著一層夾襖步出監(jiān)牢的瞬間坷澡,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評論 1 272
  • 我被黑心中介騙來泰國打工含蓉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留频敛,地道東北人。 一個月前我還...
    沈念sama閱讀 48,909評論 3 376
  • 正文 我出身青樓馅扣,卻偏偏與公主長得像斟赚,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子差油,可洞房花燭夜當晚...
    茶點故事閱讀 45,512評論 2 359

推薦閱讀更多精彩內容