0

テーブルにクエリを実行し、データベースの行ごとに Car クラスのインスタンスを作成する必要があります。ここまでたどり着きましたが、エラーが発生します

return [Car(*row) for row in rows] TypeError: init () は 1 つの位置引数を取りますが、7 つが指定されました... cars テーブルには 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__()もう 1 つの大きな問題:実際にCar行からインスタンスを作成するには、コードを記述する必要があります。クラス内の__init__()関数はCar、データベースの各行に表示されるのと同じデータである一連の引数を受け取る必要があり、各引数を 内に格納する必要がありselfます。

これは明らかにクラス プロジェクトの場合です。Car教師が望んでいるように、クラスを設計する必要があります。しかし、私は通常、car_info()関数がクラス内にあってはならないことをお勧めします。クラスは単に実装する必要がありますCar。したがって、クラスには__init__()、クラス インスタンスを作成する関数、クラス__str__()インスタンスを表す適切な出力文字列を生成する関数、および必要に応じて他のメソッド関数が必要です。Car次に、データベースにアクセスし、すべての行をプルして各行からインスタンスを作成する関数を作成できます。または、行をプルするクラス関数が必要な場合は、すべてのデータベース コードをクラス内に配置する必要があります。db_connect()今のデザインだと、普通の機能だと変に思えますが、car_info()はメソッド関数ですが、値に対して何もしないメソッド関数selfなので、実際には良いメソッド関数ではありません。それは実際にはクラス関数でなければなりません。しかし、私が言ったように、先生がこのようにやりたいと思うなら、このようにしてください。

于 2013-02-27T21:03:33.747 に答える