python中的__call__方法


在Python中,函數其實是一個對象:

>>> f = abs
>>> f.__name__
'abs'
>>> f(-123)
123

由於 f 可以被調用,所以,f 被稱為可調用對象。

所有的函數都是可調用對象。

一個類實例也可以變成一個可調用對象,只需要實現一個特殊方法__call__()。

我們把 Person 類變成一個可調用對象:

class Person(object):
    def __init__(self, name, gender):
        self.name = name
        self.gender = gender

    def __call__(self, friend):
        print 'My name is %s...' % self.name
        print 'My friend is %s...' % friend

單看 p('Tim') 你無法確定 p 是一個函數還是一個類實例,所以,在Python中,函數也是對象,對象和函數的區別並不顯著。

 

再比如:

class A(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age

f=A('hello',18)
print(f())  #TypeError: 'A' object is not callable

打印f()會報錯object is not callable,f不是可調用對象

如果在類中加上__call__方法

class A(object):
    def __init__(self,name,age):
        self.name=name
        self.age=age

    def __call__(self, *args, **kwargs):
        return self.name,self.age

f=A('hello',18)
print(f())  #('hello', 18)

此時,f就是可調用對象


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM