Python 2.7:Self作为位置而不是关键字参数

时间:2016-09-29 02:20:50

标签: python-2.7 self keyword-argument

这是一个最小的例子:

这适用于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作为禁止的关键字参数时,我将自我称为&#34; __init__&#34;的第一个参数,它应该是接收要初始化的对象的引用。变量的名称本身并不重要。我们可以完美地将名称更改为 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会抛出一个错误。

2 个答案:

答案 0 :(得分:0)

  

始终使用self作为实例方法的第一个参数。

来源:Python Documentation

答案 1 :(得分:0)

实际上,除非您保持一致,否则不必使用self关键字。看看这个示例,我将self更改为test

class funcs():
    def init(test, a, b):
        test.a=a
        test.b=b

    def plus(test):
        c = test.a + test.b
        print"%d + %d = %d" %(test.a, test.b, c)

    def minus(test):
        c = test.a - test.b
        print"%d - %d = %d" %(test.a, test.b, c)

obj = funcs()
obj.init(10, 6)
obj.plus()
obj.minus()

您可以尝试混合这些实例名称,因此不会将其命名为self

class A(object):
  def __init__(a_obj, foo):
    a_obj._foo = foo

class B(A):
  def __init__(self, test, foo):
    A.__init__(self, a_obj=test, foo=foo) # here you pass object of class B and actually another object of class B

a = A(2)
b = B(a, 1)

给出输出:

A.__init__(self, a_obj=test, foo=foo) 
TypeError: __init__() got multiple values for keyword argument 'a_obj'

我不确定通过传递这样的对象实际上想要实现什么。在您的代码中,A类中的self和B类中的self不是相同的对象。

我想在这里:A.__init__(self=self, foo=foo)你正在做A_instance=B_instanceself=self

之类的事情