由于函数是对象,所以函数比我们所预料的更灵活。例如,一旦我们创建一个函数,可以像往常一样调用它:
>>>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文章
1928浏览量
34536 -
函数
+关注
关注
3文章
4276浏览量
62314 -
python
+关注
关注
55文章
4766浏览量
84362
发布评论请先 登录
相关推荐
评论