在Python中,函數其實是一個對象,我們可以將一個函數賦值給一個變量,而不改變函數的功能。
>>> f = abs >>> f <built-in function abs> >>> abs <built-in function abs> >>> f.__name__ 'abs' >>> f(-123) 123
把內建函數abs()賦值給變量f之后,可以看到f就和abs一樣,都是。
由于 f 可以被調用,所以,f 被稱為可調用對象,而事實上,所有的函數都是可調用對象。
如果把一個類實例也變成一個可調用對象,可以實現(xiàn)一個特殊的方法__call__()。
例如,我們把Person類變成一個可調用對象:
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))
接著我們初始化一個Person對象,并對這個對象通過函數的方式調用:
>>> p = Person('Bob', 'Male') >>> p('Alice') # ==> 用函數的方式調用Person類的實例p My name is Bob... My friend is Alice...
請實現(xiàn)前面介紹過的斐波那契數列類Fib,加入__call__方法,使得調用的方式如下簡單。
>>> 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))
請驗證,完成請求
由于請求次數過多,請先驗證,完成再次請求
打開微信掃碼自動綁定
綁定后可得到
使用 Ctrl+D 可將課程添加到書簽
舉報