为什么我们不能将'自我'变成一种方法呢?

时间:2014-06-11 17:57:42

标签: python methods python-2.x

>>> class Potato(object):
...     def method(self, spam):
...         print self, spam
... 
>>> spud = Potato()

使用:

>>> Potato.method(spud, **{'spam': 123})
<__main__.Potato object at 0x7f86cd4ee9d0> 123

不能工作:

>>> Potato.method(**{'self': spud, 'spam': 123})
# TypeError

但为什么不呢?我以为自己&#39;这只是一个惯例,这个论点没有任何内在的特殊之处?

1 个答案:

答案 0 :(得分:12)

Python 2的instancemethod包装器对象坚持检查第一个位置参数,并且该检查不支持关键字参数,完全停止

>>> Potato.method(self=spud, spam=123)
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unbound method method() must be called with Potato instance as first argument (got nothing instead)

请注意,我没有在那里使用参数解包!

你可以使用位置参数:

>>> Potato.method(*(spud,), **{'spam': 123})
<__main__.Potato object at 0x1002b57d0> 123

或者您可以访问原始功能对象:

>>> Potato.method.__func__(**{'self': spud, 'spam': 123})
<__main__.Potato object at 0x1002b57d0> 123

绕过这个限制。

Python 3不再为未绑定的方法使用方法包装器;直接返回底层函数。