Родительский класс Python, получающий доступ к переменной класса дочернего класса

В настоящее время я пытаюсь реализовать некоторое наследование в моем проекте 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 как self.ATTRS в Child, а затем успешно использовать self.ATTRS в Parent, но мне кажется предпочтительнее, чтобы они были сохранены как переменная класса.

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

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

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

но мне интересно, действительно ли это каким-то образом наносит ущерб использованию наследования?

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

Спасибо

Ответ 1

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

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 в baseclass __init__.

Ответ 2

Добавляя к вышеуказанному ответу,

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

  • Проверяет пространство имен экземпляра (self. dict) для переменной ATTR.
  • Если указанное выше не удается, оно проверяет пространство имен своего класса. Таким образом, он может получить значение переменной класса, хотя он получил доступ к переменной экземпляра.