Python函数有一个描述符。我相信在大多数情况下我不应该直接使用它,但我想知道这个功能是如何工作的?我试着对这样的对象进行了几次操作:
def a():
return 'x'
a.__get__.__doc__
'descr.__get__(obj[, type]) -> value'
什么是obj,什么是类型?
>>> 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)
当然,我不能用不带参数的函数来做这个技巧。是否只需要调用带参数的函数?
>>> def d(arg1, arg2, arg3):
return arg1, arg2, arg3
>>> d.__get__('s')('x', 'a')
('s', 'x', 'a')
为什么__get__
直接采用第一个参数,返回对象采用其他所有参数?
答案 0 :(得分:8)
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)
来确认1}}。基本上,__get__
只能完成绑定过程的一部分。
这就是为什么你不能为不带参数的函数执行此操作的原因 - 它必须采用传递特定实例的第一个参数(传统的self
)。