Изменение родительской переменной через функцию дочернего класса в Python - PullRequest
0 голосов
/ 19 июня 2020

, поэтому я только недавно начал делать OOP в python, и у меня не так много знаний в OOP в целом. Мне было интересно, могу ли я создать дочерние классы через родительский класс, а затем изменить переменную родительского класса через созданный дочерний класс?

class Parent:
    def __init__(self, var1, var2, var3):
        self.var1 = var1
        self.var2 = var2
        self.var3 = var3

    def create_child(self, count):
        array = []
        for x in range(count):
            array.append(Child(var4=self.var1))
        return array

class Child(Parent):
    def __init__(self, var4):
        super(Parent, self).__init__()
        self.var4 = var4

    def alter_parent_variable(self, value):
        self.var1 += value

Скажем, я создал код, как показано выше, я продолжаю получать сообщение об ошибке:

TypeError: init () отсутствует 3 обязательных позиционных аргумента: 'var1', 'var2' и 'var3'

Используя этот код для test:

test = Parent(20, 50, 1)

array = test.create_child(3)

for x in array:
    x.alter_parent_variable(50)

Допустим, я добавил еще одну функцию с тем же кодом, что и в родительском классе, в дочерний класс (как указано ниже). Могу ли я напрямую изменить переменную родительского класса через дочерний класс, созданный дочерним классом?

    def create_child(self, count):
    array = []
    for x in range(count):
        array.append(Child(var4=self.var1))
    return array

1 Ответ

0 голосов
/ 19 июня 2020

Вы получаете TypeError, потому что вы вызываете Parent __init__ (когда вы вызываете super(Parent, self).__init__()), не давая достаточного количества аргументов.

Способ изменения Parent s var1 не будет работать, потому что, хотя Child наследуется от Parent, они не будут одним и тем же классом instance (self всегда относится к классу instance , а не сам класс).

Но вы можете передать ссылку на Parent, передав self, и изменить var1 таким образом.

Например:

class Child(Parent):
    def __init__(self, var4, parent: Parent):
        self.var4 = var4
        self.parent = parent

    def alter_parent_variable(self, value):
        self.parent.var1 += value

Тем не менее, в зависимости от того, чего вы в конечном итоге пытаетесь достичь, могут быть лучшие способы сделать что-то.

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