Как переопределить родительский класс? - PullRequest
0 голосов
/ 31 мая 2019

У меня есть два класса:

class Parent(object):
    def __init__(self):
        self.a = 0
        self.b = self.a + 1

class Child(Parent):
    def __init__(self):
        super().__init__()
        self.a = 1

print(Child().b)

Вывод 1 (0+1), но я ожидаю, что 2 (1+1). Как мне достичь такого результата?

Ответы [ 2 ]

0 голосов
/ 31 мая 2019

Вы можете использовать key word argument для установки значения a в родительском классе, если аргумент не предоставлен:

class Parent(object):
    def __init__(self, a=None):
        if a is None:
            self.a = 0
        self.b = self.a + 1

class Child(Parent):
    def __init__(self):
        self.a = 1
        super().__init__(self.a)

parent = Parent()
child = Child()
print(parent.a, parent.b) 
print(child.a, child.b)

выход:

0 1
1 2

Другой подход может использовать переменные класса :

class Parent(object):
    a = 0
    def __init__(self):
        self.a = self.__class__.a
        self.b = self.a + 1

class Child(Parent):
    a = 1
    def __init__(self):
        super().__init__()

parent = Parent()
child = Child()
print(parent.a, parent.b) 
print(child.a, child.b)

выход:

0 1
1 2

Выше, используя переменные класса, вы можете полностью обойтись без метода __init__ в дочернем классе: (это может или не может быть применимо к вашему случаю использования в реальном мире)

class Parent(object):
    a = 0
    def __init__(self):
        self.a = self.__class__.a
        self.b = self.a + 1

class Child(Parent):
    a = 1
0 голосов
/ 31 мая 2019

атрибут a за пределами Parent.__init__:

class Parent(object):
    a = 0
    def __init__(self):
        self.b = self.a + 1

class Child(Parent):
    def __init__(self):
        self.a = 1
        super().__init__()

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