将对象附加到python中的全局列表

时间:2014-10-06 21:33:05

标签: python list class object

我试图让用户创建一个名为NoteSet的对象,每个NoteSet都会被放入一个名为db的全局列表中。这是我试图做到这一点:

import sys
import datetime
db = list()
class NoteSet:
    nextseqNum = 0
    def __init__(self,name,description,hidden):
        global db
        self.seqNum = Note.nextseqNum
        self.name        = name
        self.description = description
        self.dateCreated = datetime.date.today()
        self.hidden      = hidden
        self.notes       = list()
        db[self.seqNum]  = self
        print(self)
        print(len(db))
        Note.nextseqNum  += 1

当我尝试创建一个对象时,例如:

NoteSet('example','ex',True)

它给了我错误

  

追踪(最近一次通话):     文件"",第1行,in       NoteSet('例如''前',真)     文件" C:\ Users \ Brandon \ Desktop \ step5.py",第22行, init       db [self.seqNum] = self   IndexError:列表分配索引超出范围

这是制作全局对象列表的正确方法吗?

2 个答案:

答案 0 :(得分:0)

您收到此错误是因为db中没有元素(python列表初始化为长度为0),因此当您尝试替换位置self.seqNum处的元素时,您将获得无效索引。它与它的全球性无关。

如果我们假设这个全局列表只能以线程安全的方式访问,那么您应该能够做到:

db.appened(self)

相反。但是,正如评论中所提到的,如果此类是“守门员”,则在此用例中更有意义的是使db成为类变量。与db列表连接。

<强>更新

在评论中解决OP的问题,

  

我希望能够通过seqNum跟踪列表中对象的位置

正如当前所写的那样,seqNum将始终与每个新的NoteSet实例一起线性增加。如果我们假设Note.nextseqNum的线程安全访问权限,那么您通过db[self.seqNum]尝试执行的操作已经通过db.append(self)隐式完成,因为len(db) == Note.nextseqNum始终是。db。目前,我们会忽略如果您从seqNum中删除 删除 元素后会发生什么,因为现在您的系统没有帐户对于那个,并且无论如何都会彻底破坏。

但是,如果将来db在每次制作新实例时都不会永远单调增加,那么您只需将dict设为list而不是db = dict() db[self.seqNum] = self

db

然后将新实例完全插入到当前,

seqNum

NoteSet现在明确表示dbdel db[instance.seqNum]映射,而不是基于数组索引的隐式关系。

我实际上建议这样做,因为它还可以解决从seqNum删除免费项目的问题。实际上,对于在删除的实例之后出现的任何实例,执行db将使dbdict的所有映射完全无效。但如果seqNumdb,则此操作会按预期执行,并且所有import sys import datetime class NoteSet: nextseqNum = 0 db = dict() def __init__(self,name,description,hidden): self.seqNum = NoteSet.nextseqNum self.name = name self.description = description self.dateCreated = datetime.date.today() self.hidden = hidden self.notes = list() NoteSet.db[self.seqNum] = self print(self) print(len(db)) NoteSet.nextseqNum += 1 值仍会映射到{{1}}中的正确实例。

所以,为了把它们整合在一起,我建议你改变你的课程,如下所示:

{{1}}

答案 1 :(得分:0)

正如@aruisdante所说,你需要附加到列表

试试这个:

db = []

class ListObj:
    def __init__(self, name, msg, hide=False):
        self.name = name
        self.msg = msg
        self.hide = hide
        db.append(self)

祝你好运!