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不再使用方法包装器来处理未绑定的方法; 直接返回底层函数.