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

时间:2015-12-14 09:38:21

标签: python postgresql

我想从查询数据库中为python中的类对象设置属性值,但是我收到此错误:

Traceback (most recent call last):
File "D:/s2/semester 3/tesis/phyton/connectDatabase", line 27, in <module>
data.append(Spatial_object(row[i]))
TypeError: __init__() takes exactly 4 arguments (2 given)

这是我的代码:

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]))

2 个答案:

答案 0 :(得分:2)

Python确切地说明了问题所在 - Spatial_object.__init__()方法需要三个显式参数:jenisLatLon,而Spastial_object(row[i])只提供一个}}。尝试将行破坏为参数列表,即:Spatial_object(*row[i])

答案 1 :(得分:0)

假设primary_descript映射到jenis,那么你需要传递它以及你从数据库中检索的lat和long(一旦你的代码的那部分工作juga :))实例化Spatial_object对象。

这是因为类__init__()的{​​{1}}方法需要4个参数:Spatial_objectselfjenisLat来匹配声明:

Long

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

代码的第二部分看起来不会起作用,例如什么是self?无论如何,您不需要知道返回了多少行,您可以使用以下内容迭代行:

rows_effected

您甚至可以使用列表解析进一步简化代码:

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更好。