クラスインスタンスにメソッドを追加する場合、次のような単純な割り当てを行うことはできません。
>>> 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
<function print_var at 0x98e86ec>
>>> c.print_var()
Traceback (most recent call last):
File "<pyshell#149>", line 1, in <module>
c.print_var()
TypeError: print_var() takes exactly 1 argument (0 given)
関数をメソッドと見なす(つまり、インスタンスにバインドする)ために、私は次のコードを使用していました。
>>> import types
>>> c.print_var = types.MethodType(print_var, c)
>>> c.print_var
<bound method MyClass.print_var of <__main__.MyClass object at 0x98a1bac>>
>>> c.print_var()
5
.__get__
しかし、私はそれがこの目的にも使用できることを発見しました:
>>> c.print_var = print_var.__get__(c)
>>> c.print_var
<bound method MyClass.print_var of <__main__.MyClass object at 0x98a1bac>>
>>> c.print_var()
5
ここでの問題は、それが正しく機能することですが、その方法と理由がわかりません。に関するドキュメント.__get__
はあまり役に立たないようです。
誰かがPythonのインタプリタのこの振る舞いを明らかにしてくれれば幸いです。