在 python 应用程序中存储 class 个实例的正确方法
proper way to store class instances in python app
我试图了解在应用程序中存储 class 实例的最佳方式是什么,以便我可以正确访问属性并正确调用每个 class 方法。我希望解决方案与 ORM 一起工作,即 SqlAlchemy,并在最后添加 GUI。
假设我有笔记本class。还有 Note class 可以属于一个 Notebook。还有一张图片 class - 它的实例可以出现在属于不同笔记本实例的多个笔记中。
现在我想到了下面的方法(我已经做到了 simpler/without 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)
我不确定这是否是正确的方法,因为即使在这个简单的示例中,我也需要将所有 dictionaries/instance 容器放入 view_notes() 方法中。感觉一定有一个simplier/less容易出错的方法。
我找到的所有文章都说了 class 创建,但我找不到任何关于将它们放在一个应用程序和 "class instances management" 中,存储多个 class 实例(与同时存在一对多或多对多链接)的 class 不同类型的链接。
您能否通过使用代码 above/links 到 articles/books 来指导我正确 thinking/approach?
好的,我明白了。
Class 个实例可以存储在其他 class 个实例的 list/dictionary 类型的属性中(例如 Notebook 实例中的 Note 实例)。
要记住的重要一点是 实际存储的内容 在该属性中 是对位于 RAM 内存中特定地址下的实例的引用,而不是实例直接。
考虑一下:
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)之后,被复制的实际上只是对内存地址的引用。
因此,存储对象(在本例中为 Note)中的每个更改都可以通过每个 Container 访问。
我原以为第二次赋值会复制当前状态的实例 - 但事实并非如此。
感谢 hpaulj 提出正确的问题!
为了进一步阅读,我需要查找 'collection class' 我认为。
我试图了解在应用程序中存储 class 实例的最佳方式是什么,以便我可以正确访问属性并正确调用每个 class 方法。我希望解决方案与 ORM 一起工作,即 SqlAlchemy,并在最后添加 GUI。
假设我有笔记本class。还有 Note class 可以属于一个 Notebook。还有一张图片 class - 它的实例可以出现在属于不同笔记本实例的多个笔记中。
现在我想到了下面的方法(我已经做到了 simpler/without 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)
我不确定这是否是正确的方法,因为即使在这个简单的示例中,我也需要将所有 dictionaries/instance 容器放入 view_notes() 方法中。感觉一定有一个simplier/less容易出错的方法。
我找到的所有文章都说了 class 创建,但我找不到任何关于将它们放在一个应用程序和 "class instances management" 中,存储多个 class 实例(与同时存在一对多或多对多链接)的 class 不同类型的链接。
您能否通过使用代码 above/links 到 articles/books 来指导我正确 thinking/approach?
好的,我明白了。 Class 个实例可以存储在其他 class 个实例的 list/dictionary 类型的属性中(例如 Notebook 实例中的 Note 实例)。
要记住的重要一点是 实际存储的内容 在该属性中 是对位于 RAM 内存中特定地址下的实例的引用,而不是实例直接。
考虑一下:
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)之后,被复制的实际上只是对内存地址的引用。
因此,存储对象(在本例中为 Note)中的每个更改都可以通过每个 Container 访问。 我原以为第二次赋值会复制当前状态的实例 - 但事实并非如此。
感谢 hpaulj 提出正确的问题! 为了进一步阅读,我需要查找 'collection class' 我认为。