0

我需要查询表,并为数据库中的每一行创建一个 Car 类的实例。我已经达到了这一点,但我收到了一个错误

return [Car(*row) for row in rows] TypeError: init () 接受 1 个位置参数,但给出了 7 个……汽车表有 6 个属性……哎呀!

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()
4

1 回答 1

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()是一个方法函数……但它是一个对值不做任何事情的方法函数self,所以它并不是一个真正的好方法函数;它真的应该是一个类函数。但正如我所说,如果你的老师想要这样做,就这样做。

于 2013-02-27T21:03:33.747 回答