在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 被稱為可調用對象,而事實上,所有的函數都是可調用對象。
如果把一個類實例也變成一個可調用對象,可以實現一個特殊的方法__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...
請實現前面介紹過的斐波那契數列類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 可將課程添加到書簽
舉報