Как передать все переменные класса из родительского * instance * в дочерний класс? - PullRequest
1 голос
/ 24 марта 2020

Вот пример того, что я пытаюсь сделать:

class Parent():
    def __init__():
        self.parent_var = 'ABCD'
        x = Child(self)    # self would be passing this parent instance

class Child():
    def __init__(<some code to pass parent>):
        print(self.parent_var)

foo = Parent()

Теперь я знаю, о чем вы думаете, почему бы просто не передать себя parent_var самому дочернему экземпляру? Ну, моя фактическая реализация имеет более 20 переменных класса в Parent. Я не хочу вручную передавать каждую переменную в __init__ экземпляра Child, который создается в Parent - есть ли способ сделать все переменные класса Parent доступными для Child?

РЕДАКТИРОВАТЬ - РЕШЕНО: Это как я нашел, что работает:

class Parent():
    def __init__(self):
        self.parent_var = 'ABCD'  # but there are 20+ class vars in this class, not just one
        x = Child(self)           # pass this parent instance to child        

class Child():
    def __init__(self, parent):
        for key, val in vars(parent).items():
            setattr(self, key, val)

        print(self.parent_var)  # successfully prints ABCD


foo = Parent()

Ответы [ 3 ]

2 голосов
/ 24 марта 2020

Если вы наследуете от родительского класса, все переменные будут присутствовать в дочерних классах. Используйте super init в child, чтобы убедиться, что родительский класс создан.

class Parent:
    def __init__(self):
        self.parent_var = 'ABCD'

class Child(Parent):
    def __init__(self):
        super().__init__()

child = Child()
print(child.parent_var)

отпечатки:

'ABCD'

1 голос
/ 24 марта 2020

Нашел решение и хотел опубликовать ответ на тот случай, если кому-то это понадобится:

class Parent():
    def __init__(self):
        self.parent_var = "ABCD"  # just an example
        x = Child(self)           # pass this parent instance (this object) to child        

class Child():
    def __init__(self, parent):
        # copies variables from passed-in object to this object
        for key, val in vars(parent).items():
            setattr(self, key, val)

        print(self.parent_var)  # successfully prints ABCD


foo = Parent()
1 голос
/ 24 марта 2020

Вы передадите экземпляр Parent, как если бы вы указали любое значение.

class Parent:
    def __init__(self):
        self.parent_var = 'ABCD'
        x = Child(self)

class Child:
    def __init__(self, obj):
        print(obj.parent_var)
...