Атрибут, унаследованный от дочернего класса, печатает дочерний объект, а не строку из родительского - PullRequest
0 голосов
/ 10 октября 2018

Я знаю, что многие темы, связанные с наследованием классов в Python, были рассмотрены, но я не смог найти поток, посвященный этой конкретной проблеме.

Редактировать: я использую Python 3.5.5.

Код:

class Parent():
    def __init__(self, parentParam="parent param"):
        self.parentParam = parentParam

class Child(Parent):
    def __init__(self, childParam = "child param"):
        self.childParam = childParam
        super().__init__(self)

child = Child()
print(child.childParam)
print(child.parentParam)

Вывод:

child param
<__main__.Child object at 0x0000017CE7C0CAC8>

Почему child.parentParam возвращает дочерний объект, а не строку "parent param"?Я чувствую, что он должен распечатать строку по умолчанию, установленную для класса Parent.Похоже, что это тот же синтаксис, который я использовал в этом руководстве .

Спасибо всем.

Ответы [ 2 ]

0 голосов
/ 10 октября 2018

Поскольку вы предоставляете экземпляр child (он же self) для супер-вызова:

class Child(Parent):
    def __init__(self, childParam = "child param"):
        self.childParam = childParam
        super().__init__(self) # here you override the default by supplying this instance

Используйте вместо этого:

class Child(Parent):
    def __init__(self, childParam = "child param"):
        self.childParam = childParam
        super().__init__() 

и вместо этого вы получите такой вывод:

child param
parent param
0 голосов
/ 10 октября 2018

Ваш звонок на super неправильный.Нет необходимости явно передавать аргумент self при его использовании для делегирования вызова метода суперклассу (см. Типичный пример использования, показанный в документации ).

В Python 3 вызовы super() без аргументов эквивалентны super(CurrentClass, self).method(arg) - что было единственным способом сделать это в Python 2 - без необходимости указывать его вообще при выполнениивызовы методов суперкласса.

Итак, поскольку вы передали его в свой код, он интерпретируется как переопределяющее значение по умолчанию, указанное для аргумента parentParam.

Вот как это делается правильно, и результат:

class Parent:
    def __init__(self, parentParam="parent param"):
        self.parentParam = parentParam


class Child(Parent):
    def __init__(self, childParam="child param"):
        self.childParam = childParam
        super().__init__()  # NO NEED TO PASS self.


child = Child()
print(child.childParam)   # -> child param
print(child.parentParam)  # -> parent param
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...