Python中的魔法函式

2021-08-10 22:00:40 字數 2954 閱讀 3265

在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...