2013-02-10 78 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