Питон доступ к переменной родительского класса из дочернего класса
в настоящее время я пытаюсь реализовать некоторое наследование в своем проекте 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 делает следующее, используя пространства имен
- проверяет пространство имен экземпляра (self.дикт) для переменной ATTR.
- если выше не работает, то он проверяет пространство имен этого класса. Таким образом, он может получить значение переменной класса, хотя доступ к нему осуществляется с помощью переменной instance.