【发布时间】:2014-07-23 14:25:28
【问题描述】:
我有一些带有猴子匹配部分的愚蠢代码。以下示例仅供自学使用,不用于生产。
class MyClass:
def some_method(self):
print("some_method call")
self.yet_another_method()
def yet_another_method(self):
print('yet_another_method call')
def some_function(self):
print("some function call")
self.yet_another_method()
obj = MyClass()
obj.some_method()
obj.some_method = some_function
obj.some_method()
当我执行此代码时,我收到以下错误:
TypeError: non_class_some_method() missing 1 required positional argument: 'self'
很明显Python解释器不能在some_function中隐式传递obj。但是当我进行自省并获取字节码时,我有类似的方法表示(替换之前和之后)。
import dis
import inspect
class MyClass:
def some_method(self):
print("some_method call")
self.yet_another_method()
def yet_another_method(self):
print('yet_another_method call')
def some_function(self):
print("some function call")
self.yet_another_method()
obj = MyClass()
dis.dis(obj.some_method)
print(inspect.getargspec(obj.some_method))
obj.some_method = some_function
print("======================================================================")
dis.dis(obj.some_method)
print(inspect.getargspec(obj.some_method))
结果:
8 0 LOAD_GLOBAL 0 (print)
3 LOAD_CONST 1 ('some_method call')
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
9 10 LOAD_FAST 0 (self)
13 LOAD_ATTR 1 (yet_another_method)
16 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
19 POP_TOP
20 LOAD_CONST 0 (None)
23 RETURN_VALUE
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
======================================================================
16 0 LOAD_GLOBAL 0 (print)
3 LOAD_CONST 1 ('some function call')
6 CALL_FUNCTION 1 (1 positional, 0 keyword pair)
9 POP_TOP
17 10 LOAD_FAST 0 (self)
13 LOAD_ATTR 1 (yet_another_method)
16 CALL_FUNCTION 0 (0 positional, 0 keyword pair)
19 POP_TOP
20 LOAD_CONST 0 (None)
23 RETURN_VALUE
ArgSpec(args=['self'], varargs=None, keywords=None, defaults=None)
请谁能解释一下为什么会这样?
【问题讨论】:
-
发生这种情况是因为在实例上定义的函数永远不会转换为绑定方法,它们应该定义为类属性。(或者您可以使用
types.MethodType将函数注册为使用实例的方法。) -
如果您只想更改类的一个实例的方法,而不是类的所有实例,那么您的问题在这里得到解答:stackoverflow.com/questions/972/…
标签: python monkeypatching