1. 程式人生 > >Python中的__init__()和__call__()函式

Python中的__init__()和__call__()函式

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