为什么要使用__xxx__定义funtion的属性?

时间:2018-05-25 06:05:27

标签: python python-3.x function python-decorators

我是这里的新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__"通常用于定义特殊方法和属性,为什么代码定义函数的属性使用样式?这不是在倡导吗? 并且可以动态地向函数添加属性以及动态地向类添加属性吗? 太多了〜

1 个答案:

答案 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;