Python函数属性 – 使用和滥用

问题:

没有多少人知道这个功能,但Python的功能(和方法)可以有attributes。看吧:

>>> def foo(x):
...     pass
...     
>>> foo.score = 10
>>> dir(foo)
['__call__', '__class__', '__delattr__', '__dict__', '__doc__', '__get__', '__getattribute__', '__hash__', '__init__', '__module__', '__name__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__str__', 'func_closure', 'func_code', 'func_defaults', 'func_dict', 'func_doc', 'func_globals', 'func_name', 'score']
>>> foo.score
10
>>> foo.score += 1
>>> foo.score
11

这个功能在Python中有哪些可能的用法和滥用?我知道的一个很好的用法是PLY使用docstring将语法规则与方法相关联。但是自定义属性怎么样?有很好的理由使用它们吗?

回答:

我通常使用函数属性作为注释的存储。假设我想以C#的风格写(表示一定的方法应该是Web服务界面的一部分)

class Foo(WebService):
    @webmethod
    def bar(self, arg1, arg2):
         ...

那我可以定义

def webmethod(func):
    func.is_webmethod = True
    return func

然后,当webservice调用到达时,我查找该方法,检查底层函数是否具有is_webmethod属性(实际值是无关紧要的),如果该方法不存在或不意味着通过Web调用,则拒绝该服务。

 
 
Code问答: http://codewenda.com/topics/python/
Stackoverflow: Python function attributes – uses and abuses

*转载请注明本文链接以及stackoverflow的英文链接

发表评论

电子邮件地址不会被公开。 必填项已用*标注

84 + = 94