Как переопределить атрибуты в подклассе, но поддерживать методы суперкласса в python2.7? - PullRequest
0 голосов
/ 15 декабря 2018

Я хочу наследовать атрибут в моем подклассе, но я хочу вызвать метод из суперкласса.

Чтобы наследовать атрибут от родителя, мне нужно вызвать super для него.Но когда я вызываю super, он дает ему атрибут из суперкласса, а не из подкласса.Как мне убедиться, что он получает атрибут, который я назначил ему при определении подкласса?

class SuperClass2(object):
    def __init__(self, passed_in):
        self.attribute = 4
        self.passed_in = passed_in
        self.shared_method()

    def shared_method(self):
        assert self.passed_in == self.attribute, ' sorry they are not equal '

class SubClass2(SuperClass2):
    def __init__(self, passed_in):
        self.attribute = 3  # i set attribute to 3 here
        self.passed_in = passed_in
        super(SubClass2, self).__init__(passed_in)  # I already set attribute to 3 ....but gets overwritten when I call super

В приведенном выше примере child=SubClass2(3) дает AssertionError: sorry they are not equal.

Как вы можете видетьв приведенном выше примере он не разрешит мне атрибут, установив его равным 3. Как переопределить атрибуты в подклассе, но поддерживать методы суперкласса?

1 Ответ

0 голосов
/ 15 декабря 2018

Метод 1

Очевидным является вызов сначала super(), затем изменение атрибутов

class SubClass2(SuperClass2):
  def __init__(self, passed_in):
    super(SubClass2, self).__init__(passed_in)
    self.attribute = 3  # i set attribute to 3 here
    self.passed_in = passed_in

Метод 2

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

class SuperClass2(object):
    def __init__(self, passed_in, attribute=4):
        self.attribute = attribute
        self.passed_in = passed_in
        self.shared_method()

    def shared_method(self):
        assert self.passed_in == self.attribute, ' sorry they are not equal '

class SubClass2(SuperClass2):
    def __init__(self, passed_in):
        super(SubClass2, self).__init__(passed_in=passed_in, attribute=3) 

Метод 3

Делегирование инициализации отдельному методуи затем переопределите этот метод в подклассе

class SuperClass2(object):
    def __init__(self, passed_in):
        self._init(passed_in)
        self.shared_method()

    def _init(passed_in):
        self.attribute = 4
        self.passed_in = passed_in

    def shared_method(self):
        assert self.passed_in == self.attribute, ' sorry they are not equal '

class SubClass2(SuperClass2):
    def __init__(self, passed_in):
        super(SubClass2, self).__init__(passed_in=passed_in) 

    def _init(passed_in):
        self.attribute = 3
        self.passed_in = passed_in
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...