python - 函数中的预定义描述符如何工作?

标签 python function metaprogramming descriptor

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__ 获取,而其他所有参数由返回的对象获取?

最佳答案

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

class C(object):
    pass

def a(s):
    return 12

a = a.__get__(C)

大致相当于

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

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

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

关于python - 函数中的预定义描述符如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14799860/

相关文章:

python - 在单行 for 循环中分配给列表的一项

python - 如何使用 Numpy/Keras 将加载图像的一部分置零?

Javascript 函数未定义,尽管事实上它是

Ruby:在另一个方法中定义一个方法有什么实际用途吗?

ruby - 如何检索类名?

ruby - 重命名由 gem 添加的方法

python - 在 Tkinter TreeView 中插入数据以更正列时面临问题

python - 从python控制rs232 windows终端程序

c - 我不断收到此错误 : pointer value used where a floating point value was expected

JavaScript 验证问题?