3

我有两个不同的班级

class   ircChannel:
   NAME = ""

   def __init__(self):
      self.NAME = NAME

class   ircServer:
   HOST = ""
   PORT = 0
   CHAN = []

   def __init__(self, HOST, PORT):
      self.HOST = HOST
      self.PORT = PORT

   def addChan(self, CHANEL):
      self.CHAN.append(CHANEL)

我正在解析一个 XML 文件并创建一个包含 ircChannel 列表的 ircServer 列表

for server in servers
    ircBot.addServer(ircServer(HOST, PORT))
    for channel in channels 
         ircBot.SERVERS[-1].addChan(ircChannel(channel.name))

当我打印结果时,我不断重复

ircBot
   Server 1 -
       Channel1
       Channel2
       Channel3
   Server 2 -
       Channel1
       Channel2
       Channel3

但我需要的只是

ircBot
   Server 1 -
       Channel1
       Channel2
   Server 2 -
       Channel3

当我显然创建两个不同的 irsServer 实例并添加不同的频道时,为什么这两个列表保持相同的频道?

我尝试在 ircServer 类的init中清空列表,但它不起作用。

4

3 回答 3

2

问题在这里:

class   ircServer:
   HOST = ""
   PORT = 0
   CHAN = []

这些是整个类的成员,而不仅仅是它的单个对象(实例)。要修复它,请将其移至构造函数 ( __init__):

class   ircServer:
   def __init__(self, HOST, PORT):
       self.HOST = HOST
       self.PORT = PORT
       self.CHAN = []

类成员就像作用域的全局变量。它们有一些实用性,但它们似乎对解决这个特定问题没有用处。如果有任何情况,它可能是默认端口号:

class ircServer:
    DEFAULT_PORT = 44100
    def __init__(self, HOST, PORT = DEFAULT_PORT):
        self.HOST = HOST
        self.PORT = PORT
        self.CHAN = []
于 2013-06-30T12:59:08.827 回答
1

失去类属性。无论如何,您都没有使用它们。实际上,它导致了您的错误,因为所有实例似乎都共享相同的CHAN列表

class   ircServer:
   def __init__(self, HOST, PORT):
      self.HOST = HOST
      self.PORT = PORT
      self.CHAN = []

   def addChan(self, CHANEL):
      self.CHAN.append(CHANEL)

还可以考虑阅读 PEP8 并至少遵循其中的大部分指南

于 2013-06-30T12:57:45.537 回答
1

调整

class   ircServer:
   HOST = ""
   PORT = 0

   def __init__(self, HOST, PORT):
      self.CHAN = []
      self.HOST = HOST
      self.PORT = PORT

   def addChan(self, CHANEL):
      self.CHAN.append(CHANEL)

elseCHAN是类属性,对于所有类实例都相同。做self.CHAN = []in__init__将创建CHAN一个实例属性。

于 2013-06-30T12:58:49.317 回答