由于函數是對象,所以函數比我們所預料的更靈活。例如,一旦我們創建一個函數,可以像往常一樣調用它:
>>>def func(a):
... b = 'spam'
... return b * a
...
>>>func(8)
'spamspamspamspamspamspamspamspam'
我們也可以通用地檢查它們的屬性(如下代碼在Python 3.0中運行,但是Python 2.6中的結果是類似的):
>>>func.__name__
'func'
>>>dir(func)
['__annotations__','__call__','__class__','__closure__','__code__',
...more omitted...
'__repr__','__setattr__','__sizeof__','__str__','__subclasshook__']
其中一些屬性還提供了函數的本地變量和參數等方面的細節:
>>>func.__code__
>>>dir(func.__code__)
['__class__','__delattr__','__doc__','__eq__','__format__','__ge__',
...more omitted...
'co_argcount','co_cellvars','co_code','co_consts','co_filename',
'co_firstlineno','co_flags','co_freevars','co_kwonlyargcount','co_lnotab',
'co_name','co_names','co_nlocals','co_stacksize','co_varnames']
>>>func.__code__.co_varnames
('a','b')
>>>func.__code__.co_argcount
1
工具編寫者可以利用這些信息來管理函數。
函數對象不僅限于前面列出的系統定義的屬性。我們也可以向函數附加任意的用戶定義的屬性:
>>>func
>>>func.count = 0
>>>func.count += 1
>>>func.count
1
>>>func.handles = 'Button-Press'
>>>func.handles
'Button-Press'
>>>dir(func)
['__annotations__','__call__','__class__','__closure__','__code__',...more omitted...
__str__','__subclasshook__','count','handles']
這樣的屬性可以用來直接把狀態信息附加到函數對象,而不必使用全局、非本地和類等其他技術。和非本地不同,這樣的屬性可以在函數自身的任何地方訪問。從某種意義上講,這也是模擬其他語言中的“靜態本地變量”的一種方式——這種變量的名稱對于一個函數來說是本地的,但是,其值在函數退出后仍然保留。
-
編程語言
+關注
關注
10文章
1950瀏覽量
34988 -
函數
+關注
關注
3文章
4346瀏覽量
62977 -
python
+關注
關注
56文章
4807瀏覽量
85040
發布評論請先 登錄
相關推薦
評論