【问题标题】:How work pre-defined descriptors in functions?函数中的预定义描述符如何工作?
【发布时间】:2013-02-10 16:29:17
【问题描述】:

Python 函数有一个描述符。我相信在大多数情况下我不应该直接使用它,但我想知道这个功能是如何工作的?我对这样的对象尝试了一些操作:

  1.  

    def a():
        return 'x' 
    
    a.__get__.__doc__
    'descr.__get__(obj[, type]) -> value'
    

    obj是什么,类型是什么?

  2.  

    >>> a.__get__()
    TypeError:  expected at least 1 arguments, got 0
    
    >>> a.__get__('s')
    <bound method ?.a of 's'>
    
    >>> a.__get__('s')()
    TypeError: a() takes no arguments (1 given)
    

    当然,我不能用不带参数的函数来做这个技巧。只需要调用带参数的函数吗?

  3.  

    >>> def d(arg1, arg2, arg3):
            return arg1, arg2, arg3
    >>> d.__get__('s')('x', 'a')
    ('s', 'x', 'a')
    

    为什么__get__ 直接采用第一个参数,而返回对象则采用其他所有参数?

【问题讨论】:

    标签: python function metaprogramming descriptor


    【解决方案1】:

    a.__get__ 是一种将函数绑定到对象的方法。因此:

    class C(object):
        pass
    
    def a(s):
        return 12
    
    a = a.__get__(C)
    

    大致相当于

    class C(object):
        def a(self):
            return 12
    

    (虽然这样做不是一个好主意。一方面,C 不会知道它有一个名为a 的绑定方法,您可以通过执行dir(C) 来确认它。基本上, __get__ 只是绑定过程的一部分)。

    这就是为什么您不能对不带参数的函数执行此操作 - 它必须采用传递特定实例的第一个参数(传统上为 self)。

    【讨论】:

    • a.__get__(C) 类似于C.a,而不是第二个示例中的C().a
    猜你喜欢
    • 2023-03-09
    • 2023-04-06
    • 2012-04-16
    • 2011-10-28
    • 2022-01-08
    • 2018-06-08
    • 1970-01-01
    • 2015-12-26
    相关资源
    最近更新 更多