Python: «я» в наследство - PullRequest
0 голосов
/ 29 мая 2020

Основной c вопрос о наследовании и «я» здесь.

Хороший код без ошибок: ( Исправление : Оказывается, это тоже НЕ ХОРОШО. Пожалуйста, обратитесь к ответам Мистера Мияги ниже.)

class A:
  def __init__(self, a):
    self.a = 10
    self.b = { 'a': 10, 'b': 20 }
    self.c = [ 1, 2, 3 ]

class B(A):
  def __init__(self):
    super().__init__(self)
    print(self.a)
    print(self.b)
    print(self.c)

i = B()

Неверный код с ошибками:

class A:
  def __init__(self, a, b, c):
    self.a = 10
    self.b = { 'a': 10, 'b': 20 }
    self.c = [ 1, 2, 3 ]

class B(A):
  def __init__(self):
    super().__init__(self)
    print(self.a)
    print(self.b)
    print(self.c)

i = B()

ОШИБКА :

Traceback (most recent call last):
  File "./o", line 16, in <module>
    i = B()
  File "./o", line 11, in __init__
    super().__init__(self)
TypeError: __init__() missing 2 required positional arguments: 'b' and 'c'

Не могли бы вы объяснить, почему это должно быть:

class A:
  def __init__(self, a):

, но ни

class A:
  def __init__(self):

, ни

class A:
  def __init__(self, a, b, c):

?

Спасибо!

Ответы [ 3 ]

2 голосов
/ 29 мая 2020

Конструктор A принимает 3 аргумента, а вы даете ему 1. Это причина ошибки.

Поскольку он не использует ни один из 3 аргументов, он должен принимать 0 аргументов, а B в свою очередь должен дать ему 0 аргументов:

class A:
  def __init__(self):
    self.a = 10
    self.b = { 'a': 10, 'b': 20 }
    self.c = [ 1, 2, 3 ]

class B(A):
  def __init__(self):
    super().__init__()
    print(self.a)
    print(self.b)
    print(self.c)

i = B()
1 голос
/ 29 мая 2020

Вызов метода на super() уже правильно передает первый аргумент (self или cls). Не передавайте self явно.

class A:
  def __init__(self):  # receive implicit self
    self.a = 10
    self.b = { 'a': 10, 'b': 20 }
    self.c = [ 1, 2, 3 ]

class B(A):
  def __init__(self):
    super().__init__()  # pass self implicitly
    print(self.a)
    print(self.b)
    print(self.c)

i = B()

Вызов, такой как super().__init__(self), передает self методу дважды. Таким образом, метод должен принимать два параметра, например, def __init__(self, a). Вместо этого используйте только super().__init__() и def __init__(self), чтобы передать self один раз.

1 голос
/ 29 мая 2020

Когда вы вызываете метод объекта, объект будет назначен аргументу self функции, например:

class A:
  def someFunc(self):
    pass

a = A()
a.someFunc() # self == a

Когда вы вызываете суперфункцию, ваш собственный класс будет присвоено self, вы должны вызывать super следующим образом:

class A:
  def __init__(self, a):
    sef.a = a

class B(A):
  def __init__(self):
    a = # something
    super(self).__init__(a)
    print(self.a)

i = B()

Проблема с вашим кодом заключается в том, что вы назначаете a на self, а затем не предоставляете значение для b и c.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...