Я знаю, если вы хотите добавить метод к экземпляру класса, вы не можете выполнить простое присваивание, подобное этому:
>>> 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__
не очень помогает.
Я был бы признателен, если бы кто-нибудь прояснил это поведение интерпретатора Питона.