我知道如果你想向类实例添加一个方法,你不能像这样进行简单的赋值:
>>> 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解释器的这种行为,我将不胜感激。