Перегрузка только одного определенного атрибута __init__ - PullRequest
0 голосов
/ 16 февраля 2019

У меня вопрос по поводу наследования / перегрузки.Чтобы понять мою проблему, я думаю, что лучше сначала показать фрагмент кода:

class A():
    def __init__(self):
        self.var1 = 10
        self.var2 = 20
        self.var3 = 30

class B(A):
    def __init__(self): #Bad, because I am probably overloading the whole "constructor"
        self.var2 = 15

Класс B наследуется от класса A. Теперь, на мой вопрос, есть ли способ только перегрузить значение атрибута?self.var2 в классе B, сохраняя self.var1 и self.var3 такими, какие они есть?

Ответы [ 2 ]

0 голосов
/ 16 февраля 2019

Я думаю, что вы концептуально неправильно понимаете парадигму ООП.Прежде всего, инициализатор предназначен только для инициализации объекта класса, однако в вашем коде __init__ есть значения жестких кодов для атрибутов, поэтому каждый объект класса будет иметь одинаковое значение для этих атрибутов.

Если это то, что вы хотите, то сделайте их переменными класса или просто сделайте атрибут b атрибутом класса.

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

Надеюсь, это прояснит ситуацию.

0 голосов
/ 16 февраля 2019

Если у вас нет странностей в A, например, свойства только для чтения, вы можете просто позволить A.__init__ выполнять свою работу, а затем изменить одно значение, которое вы хотите, в B.__init__:

class B(A):
    def __init__(self):
        super().__init__()
        self.var2 = 15

Но это вызывает некоторые возможные проблемы с дизайном.Если A предназначен для расширения, возможно, стоит подумать об использовании значений по умолчанию для параметров вместо жесткого кодирования их в конструкторе:

class A():
    def __init__(self, var1=10, var2=20, var3=30):
        self.var1 = var1
        self.var2 = var2
        self.var3 = var3

Теперь дочерние классы могут вызывать свой super initializer ипереопределить только те значения, которые им нужны:

class B(A):
    def __init__(self):
        super().__init__(var2=15)

или еще лучше

class B(A):
    def __init__(self, var2=15):
        super().__init__(var2=var2)
...