2013-02-10 52 views
4

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__直接采取的第一个参数,并通过一切返回的对象别的吗?

回答

5

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)。

+0

太棒了!谢谢。 – I159 2013-02-10 16:56:11

+0

'a .__ get __(C)'就像'C.a',而不是'C()。a',就像你的第二个例子。 – Eric 2013-02-10 17:42:32

+0

非常棒的答案,@大卫罗宾逊 – 2016-10-11 04:59:30