Как вызвать перезаписанный метод дочернего класса вместо метода родительского класса? - PullRequest
0 голосов
/ 06 апреля 2020

Итак, у меня есть родительский класс parent:

class Parent:
    def master(self):
       self.__slave()
    def __slave(self):
        print('No!')

И дочерний класс child:

class Child(Parent):
    def __slave(self):
        print('Yay!')

Но всякий раз, когда я вызываю child.master (), он использует __slave of Parent , Могу ли я позволить ему использовать перезаписанный метод Child, если я вызываю его из Child? Потому что с этим кодом я получаю только «Нет!».

Ответы [ 2 ]

3 голосов
/ 06 апреля 2020

Не используйте двойное подчеркивание (__) для методов, которые вы хотите переопределить, так как в нем используется искажение имен специально для того, чтобы не конфликтовать с дочерними классами.

Из документации :

Любой идентификатор формы __spam (минимум два ведущих подчеркивания, максимум одно конечное подчеркивание) текстуально заменяется на _classname__spam, где classname - это имя текущего класса с начальным подчеркиванием (s). ) раздели. Это искажение выполняется без учета позиции syntacti c идентификатора, если оно происходит в определении класса.

искажение имени полезно для того, чтобы позволить подклассам переопределять методы без прерывания вызовов методов внутрикласса. Например:

Использование одного подчеркивания, то есть _slave, решает вашу проблему, в то же время показывая пользователям, что это «закрытый» API, который они должны избегать.

0 голосов
/ 06 апреля 2020

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

class Parent:
    def master(self):
       self._slave()
    def _slave(self):
        print('No!')

class Child(Parent):
    def _slave(self):
        print('Yay!')

Child().master()

Попробуйте это.

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