引言
魔法函數是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各類免費最新入門學習資料盈厘!