在之前的文章中,我聊過了Python的 __getitem__ 和 __setitem__ 方法。這些方法被稱爲「魔法」方法、特殊方法或者dunger方法(譯者:國內書籍用「魔法」一詞較多)。那麼,什麼是魔法方法呢?這正是今天咱們要說的內容。javascript
P.S.你會再一次的深深的愛上Python語言。java
也將是一篇較長的文章,來讓咱們開始。express
魔法方法是一種具備特殊魅力的正常方法。Python經過這些魔法方法能夠賦予你的class魔力。這些魔法方法都是以雙下劃線(__)做爲前綴和後綴。坦率的講,其實這些方法並無什麼魔法,另外這些方法這Python的文檔中也沒有較爲詳細的介紹,所以,今天咱們就來詳細的看一看這些方法。數據結構
全部的Python開發者都知道,__init__()是一個類(class)的第一個方法,也能夠叫作構造函數。雖然,__init__()方法是第一個被建立的,可是它卻不是第一個被調用的執行的,__new__()方法纔是最先被調用的方法。less
看一個例子:函數
class SimpleInit(object): ''' Class to initialize a list with a value ''' def __init__(self, value=10): self._list = [value] def __del__(self): del self._list
算術運算是很是常見的,所以,若是你想建立屬於本身的數據結構,魔法方法會使你的實現更容易。例如:咱們能夠像這樣,some_list + some_list2,實現Python的列表(list)拼接。相似這種的有趣行爲,咱們能夠經過魔法方法的算術運算實現定義。spa
例如:code
class SimpleAdder(object): def __init__(self, elements=[]): self._list = elements def __add__(self, other): return self._list + other._list def __str__(self): return str(self._list) a = SimpleAdder(elements=[1,2,3,4])b = SimpleAdder(elements=[2, 3, 4])print(a + b) # [1, 2, 3, 4, 2, 3, 4]
Python不只容許咱們定義算術運算,也容許咱們定義增量賦值運算。若是你不知道什麼是增量賦值是什麼?那麼咱們來看一個簡單的例子:orm
x = 5 x += 1 # This first adds 5 and 1 and then assigns it back to 'x'
所以有的時候,你可能想寫一些自自定義邏輯實現增量賦值操做。魔法方法支持的運算符有:對象
Python有一組普遍的魔術方法實現比較。咱們能夠覆蓋默認的比較行爲,來定義使用對象的引用方法。下面是比較魔法方法的列表:
例如:
class WordCounter(object): ''' Simple class to count number of words in a sentence ''' def __init__(self, sentence): # split the sentence on ' ' if type(sentence) != str: raise TypeError('The sentence should be of type str and not {}'.format(type(sentence))) self.sentence = sentence.split(' ') self.count = len(self.sentence) def __eq__(self, other_class_name): ''' Check the equality w.r.t length of the list with other class ''' return self.count == other_class_name.count def __lt__(self, other_class_name): ''' Check the less-than w.r.t length of the list with other class ''' return self.count < other_class_name.count def __gt__(self, other_class_name): ''' Check the greater-than w.r.t length of the list with other class ''' return self.count > other_class_name.count word = WordCounter('Omkar Pathak')print(word.count)
不少時候開發人員須要隱性的轉換變量類型,來知足最要想要的結果。Python是關心你內在數據的類型的一種動態類型語言,除此以外,Python也關心你,哈哈!若是你想要自定義屬於本身的方法,能夠藉助以下方法:
這裏有一些魔法方法你應該常常遇到:
class CustomList(object): def __init__(self, elements=0): self.my_custom_list = [0] * elements def __str__(self): return str(self.my_custom_list) def __setitem__(self, index, value): self.my_custom_list[index] = value def __getitem__(self, index): return "Hey you are accessing {} element whose value is: {}".format(index, self.my_custom_list[index]) def __iter__(self): return iter(self.my_custom_list)obj = CustomList(12)obj[0] = 1print(obj[0])print(obj)
把這些有魔法的Python禮物送給你!!
coding 快樂!