【发布时间】:2016-09-29 02:20:49
【问题描述】:
这是一个最小的例子:
这适用于 python 3.5 和 2.7:
class A(object):
def __init__(self, foo):
self._foo = foo
class B(A):
def __init__(self, foo):
A.__init__(self, foo=foo)
b = B(1)
换行:
A.__init__(self, foo=foo)
到
A.__init__(self=self, foo=foo)
在 python 3.5 中运行没有问题,但在 python 2.7 中您将收到以下错误:
Traceback (most recent call last):
File "self_key.py", line 9, in <module>
b = B(1)
File "self_key.py", line 7, in __init__
A.__init__(self=self, foo=foo)
TypeError: unbound method __init__() must be called with A instance as first argument (got nothing instead)
在 python 2.7 中禁止 self 作为关键字参数还是一个错误?
更新
我知道 python 将使用绑定函数的第一个参数将引用传递给已调用的对象。我也知道__init__ 函数期望这个参数是类的一个实例。在这种情况下,A.__init__ 是未绑定的,因此我们必须手动提供该参数。
当我询问 self 作为关键字参数被禁止时,我说 self 作为“__init__ 的第一个参数”,它应该接收要初始化的对象的引用。变量本身的名称并不重要。我们完全可以把名字改成this:,例如:
class A(object):
def __init__(this, foo):
this._foo = foo
class B(A):
def __init__(self, foo):
A.__init__(this=self, foo=foo)
b = B(1)
它会是一样的。
我的问题是为什么在调用函数时,我们可以完美地将该参数指定为位置参数 (A.__init__(self, foo=foo)),但当我们尝试将其作为关键字参数 (A.__init__(this=self, foo=foo)) 传递时,python 2.7 会抛出错误。
【问题讨论】:
标签: python-2.7 self keyword-argument