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

wim*_*wim 9 python methods python-2.x

>>> class Potato(object):
...     def method(self, spam):
...         print self, spam
... 
>>> spud = Potato()
Run Code Online (Sandbox Code Playgroud)

作品:

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

不起作用:

>>> Potato.method(**{'self': spud, 'spam': 123})
# TypeError
Run Code Online (Sandbox Code Playgroud)

但为什么不呢?我认为'自我'只是一种惯例,这个论点没有任何内在的特殊之处?

Mar*_*ers 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)
Run Code Online (Sandbox Code Playgroud)

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

您可以使用位置参数:

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

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

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

绕过这个限制.

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