在python中,乙個特殊的魔術方法call可以讓類的例項的行為表現的像函式一樣。
允許乙個類的例項像函式一樣被呼叫。實質上說,這意味著 x() 與 x._call_() 是相同的。注意call引數可變。這意味著你可以定義call為其他你想要的函式,無論有多少個引數。call在那些類的例項經常改變狀態的時候會非常有效。呼叫這個例項是一種改變這個物件狀態的直接和優雅的做法。
構建自定義容器。class
entity:
def__init__
(self, x, y):
self.x = x
self.y = y
def__call__
(self, x, y):
self.x = x
self.y = y
if __name == '__main__':
someone = entity(1, 2)
# 相當於呼叫someone.__call__(3, 4)
someone(3, 4)
print someone.x
print someone.y
在python中,常見的容器型別有: dict, tuple, list, string。
其中tuple, string是不可變容器,dict, list是可變容器。
可變容器和不可變容器的區別在於,不可變容器一旦賦值後,不可對其中的某個元素進行修改。比如定義了l = [1, 2, 3]和t = (1, 2, 3)後, 執行l[0] = 0是可以的,但執行t[0] = 0則會報錯。
如果我們要自定義一些資料結構,使之能夠跟以上的容器型別表現一樣,那就需要去實現某些協議。這裡的協議跟其他語言中所謂的」介面」概念很像,一樣的需要你去實現才行,只不過沒那麼正式而已。
如果要自定義不可變容器型別,只需要定義_len_ 和 _getitem_方法;
如果要自定義可變容器型別,還需要在不可變容器型別的基礎上增加定義_setitem_ 和 _delitem_。
如果你希望你的自定義資料結構還支援「可迭代」, 那就還需要定義_iter_。
乙個不可變容器的列子:
可變容器的列子:import numpy as np
class
my_container
():def
__init__
(self):
data = np.random.randn(3, 2)
def__len__
(self):
return self.data.shape[0]
def__getitem__
(self, item):
sample = self.data[item, :]
return sample
if __name__ == '__main__':
contain = my_container()
print contain[0]
程式的輸出:
[0.12, 0.63]
# -*- coding: utf-8 -*-
class
functionallist:
''' 實現了內建型別list的功能,並豐富了一些其他方法: head, tail, init, last, drop, take'''
def__init__
(self, values=none):
if values is
none:
self.values =
else:
self.values = values
def__len__
(self):
return len(self.values)
def__getitem__
(self, key):
return self.values[key]
def__setitem__
(self, key, value):
self.values[key] = value
def__delitem__
(self, key):
del self.values[key]
def__iter__
(self):
return iter(self.values)
def__reversed__
(self):
return functionallist(reversed(self.values))
def(self, value):
defhead
(self):
# 獲取第乙個元素
return self.values[0]
deftail
(self):
# 獲取第乙個元素之後的所有元素
return self.values[1:]
definit
(self):
# 獲取最後乙個元素之前的所有元素
return self.values[:-1]
deflast
(self):
# 獲取最後乙個元素
return self.values[-1]
defdrop
(self, n):
# 獲取所有元素,除了前n個
return self.values[n:]
deftake
(self, n):
# 獲取前n個元素
return self.values[:n]
python的魔法函式
所以還是老老實實的把自己的基本功練好,物件導向玩的爐火純青,其他的不過是稍加訓練,跟賣藝的學幾招也能稱霸一片天。哈哈 牛吹的太過了,還是回到正題,總結分享一下一些稍微不太熟悉的魔法方法。一 str 它表示的是直接列印物件實現的方法,str 是被print函式呼叫的,一般都是返回乙個值,這個值是以字串...
python的魔法函式
所以還是老老實實的把自己的基本功練好,物件導向玩的爐火純青,其他的不過是稍加訓練,跟賣藝的學幾招也能稱霸一片天。哈哈 牛吹的太過了,還是回到正題,總結分享一下一些稍微不太熟悉的魔法方法。一 str 它表示的是直接列印物件實現的方法,str 是被print函式呼叫的,一般都是返回乙個值,這個值是以字串...
python魔法函式
python中魔法函式簡單上來說就是在構建某個類的時候,給類定義一些初始的方法,來實現類物件的某些屬性或者方法而準備。其形式如下,下雙劃線開頭雙劃線結尾 初始化乙個學生class class student def init self,students list self.students list...