在Python的class中有一些函數往往具有特殊的意義。__init__()和__call__()就是class很有用的兩類特殊的函數。 __init__()
在Python中,__init__()函數的意義等同於類的構造器(同理,__del__()等同於類的解構函式)。因此,__init__()方法的作用是建立一個類的執行個體。 __call__()
Python中的函數是一級對象。這意味著Python中的函數的引用可以作為輸入傳遞到其他的函數/方法中,並在其中被執行。
而Python中類的執行個體(對象)可以被當做函數對待。也就是說,我們可以將它們作為輸入傳遞到其他的函數/方法中並調用他們,正如我們調用一個正常的函數那樣。而類中__call__()函數的意義正在於此。為了將一個類執行個體當做函數調用,我們需要在類中實現__call__()方法。也就是我們要在類中實現如下方法:def __call__(self, *args)。這個方法接受一定數量的變數作為輸入。
假設x是X類的一個執行個體。那麼調用x.__call__(1,2)等同於調用x(1,2)。這個執行個體本身在這裡相當於一個函數。 總結
那麼,__init__()和__call__()的區別如下:
1. __init__()的作用是初始化某個類的一個執行個體。
2. __call__()的作用是使執行個體能夠像函數一樣被調用,同時不影響執行個體本身的生命週期(__call__()不影響一個執行個體的構造和析構)。但是__call__()可以用來改變執行個體的內部成員的值。
class X(object): def __init__(self, a, b, range): self.a = a self.b = b self.range = range def __call__(self, a, b): self.a = a self.b = b print('__call__ with ({}, {})'.format(self.a, self.b)) def __del__(self, a, b, range): del self.a del self.b del self.range
>>> xInstance = X(1, 2, 3)>>> xInstance(1,2)__call__ with (1, 2)