我需要查询表,并为数据库中的每一行创建一个Car类的实例。我已达到这一点,但我收到了错误
返回[行(*行)行中的行] TypeError: init ()需要1个位置参数,但是给出了7个... 汽车表有6个属性... oy vey!
import sqlite3 as lite
def db_connect():
con = lite.connect('ins.sqlite')
with con:
cur = con.cursor()
cur.execute('select * from cars;')
rows = cur.fetchall()
for row in rows:
#return (row) #Use list comprehension to get all rows
return [Car(*row) for row in rows]
class Car:
def car_info(self):
'Add all the necessary methods and properties you want'
a = db_connect()
return a
def __init__(self, **kwargs):
self.variables = kwargs
def main():
x = Car() #Create a Object x
a = x.car_info()
ok = tuple(map(str, a)) #convert float data into string
print ('Make Model Model Displacement
Power Luxury')
print (' '.join(ok))
main()
答案 0 :(得分:0)
这显然不对:
for row in rows:
#return (row) #Use list comprehension to get all rows
return [Car(*row) for row in cur]
我认为应该是
return [Car(*row) for row in rows]
你明白为什么会这样吗? rows
已设置为从数据库中提取的所有数据(所有行)。然后,“列表理解”将在每一行上调用Car()
,将其转换为Car
的实例。列表推导中有一个隐式循环,所以你不要把它放在for
循环中。
另一个主要问题:您需要为Car.__init__()
编写一些代码以实际从一行创建Car
实例。 __init__()
类中的Car
函数需要获取一系列参数,这些参数将出现在数据库的每一行中,然后需要将每个参数存储在self
内
这对于一个班级项目来说非常明显。您应该设计您的Car
课程,但老师希望这样做。但我通常建议car_info()
函数不应该在类中;该类应该只实现Car
。因此,类应该有__init__()
函数来创建类实例,__str__()
函数用于生成表示类实例的良好输出字符串,以及其他适当的方法函数;然后你可以拥有一个进入数据库的函数,并拉出所有行并从每一行创建Car
个实例。或者,如果您想要一个拉动行的类函数,那么所有数据库代码都应该在类中。正如设计目前一样,db_connect()
是一个普通的函数似乎很奇怪,但car_info()
是一个方法函数......但它是一个方法函数,它对{{1}没有任何作用} value,所以它不是一个很好的方法函数;它应该是一个类功能。但正如我所说,如果你的老师想要这样做,就这样做吧。