我是这里的新python。我有一个问题。代码就像这样:
def get(path):
'''
Define decorator @get('/path')
'''
def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kw):
return func(*args, **kw)
wrapper.__method__ = 'GET'
wrapper.__route__ = path
return wrapper
return decorator
这是装饰师,我不明白
"
wrapper.__method__ = 'GET'
wrapper.__route__ = path
" __xxx__
"通常用于定义特殊方法和属性,为什么代码定义函数的属性使用样式?这不是在倡导吗?
并且可以动态地向函数添加属性以及动态地向类添加属性吗?
太多了〜
答案 0 :(得分:0)
这里确实有两个问题:一个是关于为函数分配任意属性,另一个是关于分配特殊/双下划线(dunder)/魔术属性。
为函数分配属性非常好。根据{{3}}:
函数是第一类对象。
这并不意味着您可以为它们分配属性,但这是一个很好的指示。函数对象具有docs 1 ,这使得设置属性成为可能。这是一个有意且经常使用的功能。以下SO问题详述了writable __dict__
。
显示的代码问题是不正确使用dunder属性。基本上,除了官方记录的使用之外,使用dunder属性是Python function attributes - uses and abuses:
任何使用
__*__
名称,在任何情况下,如果没有明确记录使用,都会在没有警告的情况下破损。
这里有两个特殊问题。主要问题是添加未记录的dunder属性可能会与bad idea设置的正常可调用属性(在functools.wraps
1 中列出)发生冲突。第二个问题是添加dunder属性可能会在某些情况下向对象添加不良行为,因为它们被解释器用作标记。
有许多备用命名约定需要注意,其中一些比dunder方法更合适:
__method__
重命名为_method
会使其按照约定"私有,因为Python并不真正认识到Data Model的概念。 _method
的修改版本为_method_
。这是内置privacy包使用的约定,以避免破坏保留名称。method
而不是__method__
。__method
。这会由解释器触发enum
,因此呼叫者无法访问该名称。这比使用dunder名称要糟糕得多,这对于我目前所知的任何翻译都不会造成任何实际问题。<强> TL; DR 强>
为函数分配属性非常有用且完全受支持。但是,分配给dunder属性充其量是值得怀疑的。
1 向下滚动到&#34;可调用类型&#34;