Python 根据数据库查询结果设置类对象的属性值

Python 根据数据库查询结果设置类对象的属性值,python,postgresql,Python,Postgresql,我想从查询数据库中为python中类的对象设置属性值,但出现以下错误: 回溯(最近一次呼叫最后一次): 文件“D:/s2/3学期/tesis/phyton/connectDatabase”,第27行 data.append(空间对象(行[i])) TypeError:\uuuu init\uuuuuu()正好接受4个参数(给定2个) 这是我的代码: class Spatial_object: def __init__(self, jenis,Lat,Long): sel

我想从查询数据库中为python中类的对象设置属性值,但出现以下错误:

回溯(最近一次呼叫最后一次):
文件“D:/s2/3学期/tesis/phyton/connectDatabase”,第27行
data.append(空间对象(行[i]))
TypeError:\uuuu init\uuuuuu()正好接受4个参数(给定2个)
这是我的代码:

class Spatial_object:
    def __init__(self, jenis,Lat,Long):
        self.jenis=jenis
        self.Lat=Lat
        self.Long=Long

cur.execute("""SELECT primary_descript,lat,long from data_crime""")
row = cur.fetchall() 

data = []
for i in range(0,rows_effected):
    data.append(Spatial_object(row[i]))

Python准确地说明了问题所在—
空间对象。
方法需要三个显式参数:
jenis
Lat
Lon
,而在
空间对象(行[i])
中只提供一个。尝试将该行分解为参数列表,即:
spatical\u object(*row[i])

假设
primary\u descript
映射到
jenis
,则需要传递该参数以及从数据库检索到的lat和long(一旦代码的这部分工作,juga:))实例化
空间对象时
对象

这是因为类
空间对象
\uuuu init\uuuu()方法需要4个参数:
self
jenis
Lat
Long
来匹配声明:

def __init__(self, jenis,Lat,Long):
self
,它是对对象本身实例的引用,会自动传递

代码的第二部分看起来不起作用,例如,
行是什么?不管怎样,您不需要知道返回了多少行,您可以使用如下方式对这些行进行迭代:

cur.execute("""SELECT primary_descript,lat,long from data_crime""")

data = []
for jenis, lat, lon in cur.fetchall():
    data.append(Spatial_object(jenis, lat, lon))
您甚至可以通过列表进一步简化代码:

data = [Spatial_object(jenis, lat, lon) for jenis, lat, lon in cur.fetchall()]
或可读性较差的版本:

data = [Spatial_object(*row) for row in cur.fetchall()]

最后,您的类命名为
Spatial
Spatial\u object

更好。谢谢您,这是修复方法。我使用您的代码:cur.execute(““从数据中选择主描述、lat、long””)data=[]表示cur.fetchall()中的jenis、lat、lon:data.append(空间对象(jenis、lat、lon))