Родительский класс 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.
- Если указанное выше не удается, оно проверяет пространство имен своего класса. Таким образом, он может получить значение переменной класса, хотя он получил доступ к переменной экземпляра.