6

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__、他のすべてが返されたオブジェクトによって取られるのですか?

4

1 に答える 1

9

a.__get__関数をオブジェクトにバインドする方法です。したがって:

class C(object):
    pass

def a(s):
    return 12

a = a.__get__(C)

の大まかな同等物です

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

(このようにするのは良い考えではありませんが、1つには、Cと呼ばれるバインドされたメソッドがあることを知りません。これは、a実行することで確認できますdir(C)。基本的に、__get__はバインドプロセスの一部のみを実行します)。

そのため、引数をとらない関数に対してこれを行うことはできませんself。特定のインスタンスを渡す最初の引数(従来)をとる必要があります。

于 2013-02-10T16:52:29.250 に答える