您似乎需要一个集中的地方来存储您的数据,这些数据可以被任意数量的不同对象(Qt 对象、numpy 对象,没有区别)访问。我的建议是Singleton 模式。我将使用 Alex Martelli Borg 实现进行一个小实验,但请查看 this resource (Python 3 Patterns, Recipes and Idioms) 以查看一些不同的示例。
我认为解释 Singleton 最简单的方法如下:当您多次实例化同一个对象(例如 QWidget)时,每个实例将引用不同的对象。因此,如果您在一个实例中进行更改,它不会影响其他实例(一般而言)。 Singleton 的工作方式不同。您创建的每个实例都指向同一个对象。检查以下示例:
import numpy as np
class Singleton:
"""Alex Martelli implementation of Singleton (Borg)
http://python-3-patterns-idioms-test.readthedocs.io/en/latest/Singleton.html"""
_shared_state = {}
def __init__(self):
self.__dict__ = self._shared_state
class Database(Singleton):
def __init__(self):
Singleton.__init__(self)
def get(self):
return self._data
def change(self):
# Just arbitrary experiment of changing the data
self.load()
def load(self):
# For example from csv or binary files using
# np.genfromtxt or np.fromfile
self._data = np.random.randint(0, 10, (3, 3))
使用上面的代码,我刚刚创建了我的“数据库”对象。每次我调用这个数据库并询问它的数据时,它都会返回相同的数据。请注意我如何将随机 numpy 数组作为数据。假设我创建了两个新对象:
class SomeObject:
def __init__(self):
self._something = None
def doSomething(self):
db = Database()
print(db.get())
class OtherObject:
def __init__(self):
self._othersomething = None
def doOtherSomething(self):
db = Database()
print(db.get())
两者都调用数据库的一个实例。但他们会引用相同的数据吗?让我们检查一下:
# Loading data into Singleton
db = Database()
db.load()
# Creating a couple of different objects
so = SomeObject()
oo = OtherObject()
# Making sure each object is calling the database
print("Original data in database:")
so.doSomething()
oo.doOtherSomething()
# Changing data in database
db.change()
# Checking the changes in both objects.
print("Changed data in database:")
so.doSomething()
oo.doOtherSomething()
结果是这样的:
Original data in database:
[[7 4 7]
[3 4 1]
[9 5 6]]
[[7 4 7]
[3 4 1]
[9 5 6]]
Changed data in database:
[[3 8 8]
[7 2 8]
[1 5 1]]
[[3 8 8]
[7 2 8]
[1 5 1]]
因此,创建它们自己的数据库实例的两个对象都获得完全相同的数据(在调用 load 或 change 方法时是随机的)。这可能是在不同对象之间共享数据的最平易近人(和可维护)的方式。
编辑: 使数据库能够了解数据是否已加载。让我们通过添加“hasData”方法对我们的 Database 类进行一些小修改:
class Database(Singleton):
def __init__(self):
Singleton.__init__(self)
def get(self):
return self._data
def change(self):
# Just arbitrary experiment of changing the data
self.load()
def hasData(self):
return hasattr(self, "_data")
def load(self):
# For example from csv or binary files using
# np.genfromtxt or np.fromfile
self._data = np.random.randint(0, 10, (3, 3))
这个方法是询问数据库是否已经有属性_data。让我们做一个实验:
db = Database()
print(db.hasData())
db.load()
print(db.hasData())
结果:
False
True
其他变体可以使用第一个实例化来加载数据。这在很大程度上取决于您的软件的需求。