在Python中,函數(shù)其實(shí)是一個(gè)對(duì)象,我們可以將一個(gè)函數(shù)賦值給一個(gè)變量,而不改變函數(shù)的功能。
>>> f = abs >>> f <built-in function abs> >>> abs <built-in function abs> >>> f.__name__ 'abs' >>> f(-123) 123
把內(nèi)建函數(shù)abs()賦值給變量f之后,可以看到f就和abs一樣,都是。
由于 f 可以被調(diào)用,所以,f 被稱為可調(diào)用對(duì)象,而事實(shí)上,所有的函數(shù)都是可調(diào)用對(duì)象。
如果把一個(gè)類實(shí)例也變成一個(gè)可調(diào)用對(duì)象,可以實(shí)現(xiàn)一個(gè)特殊的方法__call__()。
例如,我們把Person類變成一個(gè)可調(diào)用對(duì)象:
class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender def __call__(self, friend): print('My name is {}...'.format(self.name)) print('My friend is {}...'.format(friend))
接著我們初始化一個(gè)Person對(duì)象,并對(duì)這個(gè)對(duì)象通過函數(shù)的方式調(diào)用:
>>> p = Person('Bob', 'Male') >>> p('Alice') # ==> 用函數(shù)的方式調(diào)用Person類的實(shí)例p My name is Bob... My friend is Alice...
請(qǐng)實(shí)現(xiàn)前面介紹過的斐波那契數(shù)列類Fib,加入__call__方法,使得調(diào)用的方式如下簡單。
>>> f = Fib() >>> print f(10) [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
參考答案:
class Fib(object): def __init__(self): self.res = [] def __call__(self, num): a = 0 b = 1 for x in range(num): self.res.append(a) a, b = b, a + b return self.res f = Fib() print(f(10))
請(qǐng)驗(yàn)證,完成請(qǐng)求
由于請(qǐng)求次數(shù)過多,請(qǐng)先驗(yàn)證,完成再次請(qǐng)求
打開微信掃碼自動(dòng)綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報(bào)