python3: привязать метод к экземпляру класса с помощью .__get__(), это работает, но зачем?

Я знаю, если вы хотите добавить метод к экземпляру класса, вы не можете выполнить простое присваивание, подобное этому:

>>> def print_var(self): # method to be added
        print(self.var)
>>> class MyClass:
        var = 5
>>> c = MyClass()
>>> c.print_var = print_var

Это действительно приведет к тому, что print_var будет вести себя как обычная функция, так что аргумент self не будет иметь своего типичного значения:

>>> c.print_var

>>> c.print_var()
Traceback (most recent call last):
  File "", line 1, in 
    c.print_var()
TypeError: print_var() takes exactly 1 argument (0 given)

Для того, чтобы функция рассматривалась как метод (i. e. чтобы привязать его к экземпляру), я использовал этот код:

>>> import types
>>> c.print_var = types.MethodType(print_var, c)
>>> c.print_var
>
>>> c.print_var()
5

, но обнаружил, что .__get__ также может быть использован для этой цели:

>>> c.print_var = print_var.__get__(c)
>>> c.print_var
>
>>> c.print_var()
5

Проблема здесь в том, что он просто работает, но я не могу понять, как и почему. Похоже, что документация о .__get__ не очень помогает.

Я был бы признателен, если бы кто-нибудь прояснил это поведение интерпретатора Питона.

8
задан agf 4 October 2011 в 16:17
поделиться