Python入门之函数属性

电子说

1.3w人已加入

描述

由于函数是对象,所以函数比我们所预料的更灵活。例如,一旦我们创建一个函数,可以像往常一样调用它:


>>>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']

这样的属性可以用来直接把状态信息附加到函数对象,而不必使用全局、非本地和类等其他技术。和非本地不同,这样的属性可以在函数自身的任何地方访问。从某种意义上讲,这也是模拟其他语言中的“静态本地变量”的一种方式——这种变量的名称对于一个函数来说是本地的,但是,其值在函数退出后仍然保留。

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分