首页 > 解决方案 > 停止列表在父类中是静态的

问题描述

我有以下代码

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']。我知道我可以在子类级别保存列表,但这会破坏将代码放在一个地方的目标。这是一个简化版本 - 真实的东西会有许多不同的设备。

标签: pythonlistinheritance

解决方案


在父类上创建一个__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

推荐阅读