在python应用程序中存储类实例的正确方法

时间:2016-01-10 23:34:09

标签: python class storage instances

我试图了解在应用程序中存储类实例的最佳方法是什么,以便我正确访问属性并正确调用每个类方法。我希望该解决方案能够与ORM一起使用,即SqlAlchemy,最后添加GUI。

假设我有Notebook课程。还有Note类可以属于一个Notebook。还有一个Picture类 - 它的实例可以出现在属于不同Notebook实例的多个Notes中。

现在我想到了下面的方法(我已经简化/没有ORM只是为了得到这个想法):

class Notebook(object):
    def __init__(self):
        self.notesid=[]

    def view_notes(self,notes,pictures):
        for key,item in notes.items():
            if key in self.notesid:
                item.show(pictures)

class Note(object):
    def __init__(self,id,content,picture):
        self.id = id
        self.content = content
        self.picturesid = [picture.id]
    def show(self,pictures):
        print(self.id, self.content)
        for item in pictures:
            if item.id in self.picturesid:
                print(item)

class Picture(object):
    def __init__(self,id,path):
        self.id = id
        self.path = path
    def __str__(self):
        '''shows picture'''
        return "and here's picture %s" % (self.id)

# main program

notesdict={}
pictureslist=[]

notebook1=Notebook()
picture1 = Picture('p1','path/to/file')
note1=Note('n1','hello world',picture1)

notesdict[note1.id] = note1
pictureslist.append(picture1)
notebook1.notesid.append(note1.id)

notebook1.view_notes(notesdict,pictureslist)

我不确定这是否是正确的方法,即使在这个简单的例子中我需要将所有字典/实例容器都抛出到view_notes()方法中。感觉必须有一个更简单/更少错误的方式。

我找到的关于类创建的所有文章但我找不到任何关于将它们放在一个应用程序和“类实例管理”中的任何内容,存储多个类实例(包含一对多或多对) - 同时链接不同类别的课程。

请您使用上面的代码/链接到文章/书籍,指导我正确的思考/方法吗?

1 个答案:

答案 0 :(得分:1)

好的,我明白了。 类实例可以存储在其他类实例中的列表/字典类型的属性中(例如,Notebook实例中的Note实例)。

要记住的重要事项是实际存储内容,该属性是对位于RAM内存中某个地址下的实例的引用,而不是直接实例。 < / p>

考虑一下:

class Notebook(object):    
     def __init__(self, iteminstance):
        self.lista = [iteminstance]
     def show(self):
        print('Container1 list:')
        for item in self.lista:
            print(item.content)

class Binder(object):    
     def __init__(self, iteminstance):
        self.lista = [iteminstance]
     def show(self):
        print('Container2 list:')
        for item in self.lista:
            print(item.content)

class Note(object):    
    def __init__(self, txt):    
        self.content = txt    

# create Notebook instance and store Note instance in 'lista' list argument    
a=Notebook(Note(5))    
a.show()    

# assign the same Note instance to different container, Binder instance    
b=Binder(a.lista[0])    
b.show()

# check if both containers include the same object    
print(a.lista==b.lista)
>>>True

# change content of the Note instance via Notebook instance    
a.lista[0].content = 10

# check if content has changed in both Notebook and Binder instances 
a.show()    
b.show()

因此,在第二次分配(到Binder)后,复制的内容实际上只是对内存地址的引用。

因此,每个Container都可以访问存储对象的每个更改(在本例中为注释)。 我认为第二个赋值会将实例复制到当前状态 - 但事实并非如此。

感谢hpaulj提出正确的问题! 为了进一步阅读,我认为我需要查找“收集课程”。