Проблемы с использованием «self» для доступа к родительским методам в Python - PullRequest
0 голосов
/ 04 января 2019

В Python я могу определить два класса parent и child, где дочерний класс наследуется от родительского класса. Тогда в child я могу использовать self и получить доступ к любым методам, которые существуют в родительском классе (и, вероятно, к любому другому родительскому классу в дереве наследования), если имя не было переопределено в дочернем классе.

Есть ли здесь какие-то предостережения? И рекомендуемый метод просто использовать super()?

Пример кода:

class parent:
    def add_stars(self, str):
        return '***'+str+'***'

class child(parent):
    def print_something(self):
        print(self.add_stars("Bacon"))

[In Console]
>>> c = child()
>>> c.add_stars("Wow")
'***Wow***'
>>> c.print_something()
'***Bacon***'

Редактировать: Собираюсь добавить больше ясности на основе обсуждения в комментариях для всех, кто сталкивается с этим позже. Меня смутило то, что другим способом написания вышеупомянутого child класса и получения той же функциональности было использование super():

class child(parent):
    def print_something(self):
        print(super().add_stars("Bacon"))

Это то же самое, что child также не определяет метод с именем add_stars. Если этот метод существует в child, тогда self вместо этого будет использовать метод, определенный в классе child, тогда как super() пропустит класс child и будет смотреть только в суперклассах. Кроме того, оба будут использовать один и тот же порядок разрешения методов. Я хотел знать, есть ли проблемы с использованием self, как я делал в примере, когда вы обычно используете вместо него super и т. Д.?

На это ответили ниже и в комментариях.

Ответы [ 2 ]

0 голосов
/ 04 января 2019

Лучший способ думать о super - притвориться, что он на самом деле назывался next, как в «следующем в порядке разрешения метода». В этом частном случае разницы нет. Использование self.some_method попытается разрешить "some_method" в пространстве имен текущего класса, не найти его, перейти к классу next в MRO, проверить там, найти его, и оно будет разрешено.

Если вы добавили super, пропускает текущее пространство имен класса.

В общем, это неправда, что эти два были бы эквивалентны. Вы не должны использовать super, если только это не то, что вы пытаетесь сделать, даже в тех случаях, когда это эквивалентно.

0 голосов
/ 04 января 2019

Есть ли здесь какие-то предостережения?

Нет, ваш код в порядке, он правильно вызывает родительскую функцию.

Текущий код не нуждается в super(). Если в ваших классах есть конструкторы, дочерний конструктор должен будет вызвать super().

PEP8 просит вас назвать классы Parent и Child с начальным капиталом.

Вы бы выиграли от pip install flake8 и следовали советам, которые он дает при запуске flake8 *.py.

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