如何从sqlite动态创建Python的类实例

时间:2013-02-27 20:57:14

标签: class python-3.x

我需要查询表,并为数据库中的每一行创建一个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()

1 个答案:

答案 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,所以它不是一个很好的方法函数;它应该是一个类功能。但正如我所说,如果你的老师想要这样做,就这样做吧。