Запретить списку быть статичным в родительском классе

#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