从数据库查询创建类实例-Python

从数据库查询创建类实例-Python,python,class,Python,Class,我想不出这一点,并且花了相当多的时间在这里挖掘问题和答案,但似乎没有什么是非常合适的 我定义了一个类,该类为传感器创建一个实例,其中包含各种属性和函数 在数据库中,我定义了连接的传感器。现在,如果有三个传感器,我必须这样做 sensor1 = Sensor(1) sensor2 = Sensor(2) sensor3 = Sensor(3) 我想做的是遍历数据库,返回所有定义的传感器(非常简单),然后根据该列表创建类的实例 我不知道如何获取sqlite查询的结果并使其成为类实例的名称 con

我想不出这一点,并且花了相当多的时间在这里挖掘问题和答案,但似乎没有什么是非常合适的

我定义了一个类,该类为传感器创建一个实例,其中包含各种属性和函数

在数据库中,我定义了连接的传感器。现在,如果有三个传感器,我必须这样做

sensor1 = Sensor(1)
sensor2 = Sensor(2)
sensor3 = Sensor(3)
我想做的是遍历数据库,返回所有定义的传感器(非常简单),然后根据该列表创建类的实例

我不知道如何获取sqlite查询的结果并使其成为类实例的名称

con = sqlite.connect('temp.db')
with connection:
    cur = connection.cursor()
    cur.exectute('SELECT Sensor_Id FROM Sensors')
    sensors = cur.fetchall()

# I want to do something like this.  The right side of the statement is correct, but how
# can I make the left side of the assignment be dynamic based on SQL result?
for n in sensors:
    ***sensorN*** = ClassName(n[0])
基本上,我需要创建一个类的X个实例,其中X是定义每个传感器的数据库表中的行数

这一个让我困惑不解-提前谢谢

con = sqlite.connect('temp.db')
with connection:
    cur = connection.cursor()
    cur.exectute('SELECT Sensor_Id FROM Sensors')
    sensor_ids = cur.fetchall()

# I would recommend this approach
sensor = { sid : Sensor(sid) for sid in sensor_ids }
# Which allows you to access them as
sensor['Main-hall-3'], sensor['Flap-track-fairing-7'] # etc.

# If the sensor ids are integers, you might prefer
sensor = { int(sid) : Sensor(sid) for sid in sensor_ids }
# Which allows you to access them as
sensor[3], sensor[7] # etc

# If you know that the ids are going to be CONSECUTIVE INTEGERS
# STARTING AT 0, then you could do
sensor = [ Sensor(sid) for sid in sensor_ids ]
# Which allows you to access them as
sensor[0], sensor[1] # etc

# Now, if you *really* insist on having the sensors bound to names,
# then you could try
import sys
current_module = sys.modules[__name__]
for sid in sensor_ids:
    setattr(current_module, 'sensor{}'.format(sid), Sensor(sid))
# Which would allow you to access them as
sensor1, sensor2 # etc
最后一个选项的一个缺点是,它在涉及传感器的全局变量和不涉及传感器的全局变量之间没有明确的界限。基于字典的方法(前两个建议)和基于列表的方法(第三个建议)使访问所有传感器变得很容易,除了传感器之外什么也没有。例如(在前三种情况下),很容易在所有传感器上循环;在最后一种情况下,这要复杂得多


好处:请注意,我已经抵制住了使用名称
id
(而不是
sid
)的诱惑,因为这会隐藏一个内置项。

您希望左侧是什么?如果是Sensor_Id,您可以使用sensorObjs[n[0]]之类的字典,为什么不将它们存储在列表中
the_sensors=[ClassName(n[0])表示传感器中的n个传感器]
左侧我希望是从数据库派生的实例名。数据库中的Sensor1将创建一个名为Sensor1=SensorClass()、sensor2=SensorClass()等的新实例。至于将它们存储在列表中,我想这一定是我的问题。我知道如何在列表中获取数据库结果,但如何从每个条目生成类实例。(我有种感觉,我肯定完全错过了一个完整的概念!)你不能用一个列表或字典吗?e、 g.:
lst.append(传感器(n[0]))
或其他什么东西?真管用!我自己永远也不会明白这一点。非常感谢你的帮助@PhillipMurphy只是出于好奇,你选择了哪个版本?我在这篇文章中使用了版本1。一旦你看到它是如何完成的,这是有道理的,但是哇,任何人怎么会自己想出一个呢?再次感谢@PhillipMurphy它只是使用字典来存储数据。这一点对于任何一个熟悉Python的人来说都是显而易见的。字典理解语法是python特有的,字典是python的最爱,但是对于任何语言的半经验程序员来说,将相关数据保存在某种容器中的想法应该是非常明显的。让我着迷的不是字典概念。是字典创建过程中的for循环构造吸引了我。我永远也想不到。