Питон доступ к переменной родительского класса из дочернего класса

в настоящее время я пытаюсь реализовать некоторое наследование в своем проекте Python и попал в дорожный блок. Я пытаюсь создать baseParentClass, который будет обрабатывать основные функции для многих дочерних классов. В этом конкретном примере я пытаюсь инициализировать экземпляр с несколькими атрибутами (равными 0), хранящимися как список переменных класса (называемый ATTRS) в дочернем элементе. Я не уверен, как использовать этот ATTRS в родительском классе.

class Parent(object):
    def __init__():
        for attr in ATTRS:
            setattr(self, attr, 0)

class Child(Parent):
    #class variable
    ATTRS = [attr1, attr2, attr3]

    def __init__():
        super(Child, self).__init__()

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

в качестве альтернативы я мог бы передать ATTRS в качестве параметра, например:

class Child(Parent):
    #class variable
    ATTRS = [attr1, attr2, attr3]

    def __init__():
        super(Child, self).__init__(ATTRS)

но мне интересно, может ли это как-то теряется смысл использования наследования в первую очередь?

Я был бы благодарен за любые идеи, подсказки или отзывы, если я лаю на неправильное дерево полностью!

спасибо

2 ответов


Вы были близки. Это работает:

class Parent(object):
    def __init__(self):
        for attr in self.ATTRS:
            setattr(self, attr, 0)

class Child(Parent):
    #class variable
    ATTRS = ['attr1', 'attr2', 'attr3']

    def __init__(self):
        super(Child, self).__init__()

вот, вы установите ATTRS список на уровне класса и удобный доступ к нему в self.ATTRS в класс И Л!--3-->.


добавление к приведенному выше ответу,

хотя ATTR является переменной класса в дочернем классе, переменная экземпляра дочернего класса может получить доступ к переменной класса ATTR, потому что Python делает следующее, используя пространства имен

  1. проверяет пространство имен экземпляра (self.дикт) для переменной ATTR.
  2. если выше не работает, то он проверяет пространство имен этого класса. Таким образом, он может получить значение переменной класса, хотя доступ к нему осуществляется с помощью переменной instance.