#python #list #inheritance
#python #Список #наследование
Вопрос:
У меня есть следующий код
class device(object):
triggerphrases=[]
visActive=False
def addTrigger(self,phrase):
self.triggerphrases.extend([phrase])
def SetActive(self,On):
self.visActive=On
def isActive(self):
return self.visActive
class light(device):
def setPhrase(self):
super().addTrigger("living room light")
def printPhrases(self):
print(super().triggerphrases)
class colouredLight(device):
def setPhrase(self):
super().addTrigger("coloured light")
def printPhrases(self):
print(super().triggerphrases)
firstlight=light()
firstlight.setPhrase()
firstlight.SetActive(True)
print(firstlight.isActive())
secondlight=colouredLight()
secondlight.setPhrase()
secondlight.printPhrases()
print(secondlight.isActive())
Что странно, так это то, что visactive привязан к экземпляру, где, поскольку триггерные фразы действуют статически, поэтому я получаю результат.
True
['living room light', 'coloured light']
False
Я хотел бы, чтобы список был привязан к экземпляру, и поэтому один объект возвращал [‘living room light’], а другой [‘colored light’] . Я знаю, что мог бы сохранить список на уровне подкласса, но это лишило бы цель иметь код в одном месте. Это упрощенная версия — реальная вещь будет иметь много разных устройств.
Ответ №1:
Создайте a __init__
в родительском классе и переместите переменные внутрь, чтобы они были переменными экземпляра:
class device(object):
def __init__(self):
self.triggerphrases = []
self.visActive = False
def addTrigger(self, phrase):
self.triggerphrases.extend([phrase])
def SetActive(self, On):
self.visActive = On
def isActive(self):
return self.visActive
class light(device):
def setPhrase(self):
super().addTrigger("living room light")
def printPhrases(self):
return self.triggerphrases
class colouredLight(device):
def setPhrase(self):
super().addTrigger("coloured light")
def printPhrases(self):
return self.triggerphrases
firstlight = light()
firstlight.setPhrase()
firstlight.SetActive(True)
print(firstlight.printPhrases())
print(firstlight.isActive())
secondlight = colouredLight()
secondlight.setPhrase()
print(secondlight.printPhrases())
print(secondlight.isActive())
Вывод:
['living room light']
True
['coloured light']
False