2013-02-27 4 views
0

Мне нужно запросить таблицу и создать экземпляр класса Car для каждой строки в базе данных. Я достиг этого момента, но я получаю сообщение об ошибкеКак динамически создавать экземпляры класса в Python из sqlite

возвращение [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

Это явно не прав:

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, поэтому это не очень хороший метод функция; это действительно должна быть функция класса. Но, как я сказал, если ваш учитель хочет, чтобы это было сделано так, сделайте это так.

+0

ok, я понимаю, что вы имеете в виду .... поэтому я отредактировал код выше с init, теперь я получаю сообщение об ошибке [Car (* row) для строки в строках] ТипError: __init __() принимает 1 позиционный аргумент, но 7 дано – engr007

+0

. Я обсуждал это в четвертом абзаце: «Еще одна серьезная проблема: вам нужно написать код для« Car .__ init __() », чтобы фактически создать экземпляр« Car »из строки.' __Init__() 'в классе' Car' должен принимать ряд аргументов, те же данные, которые будут отображаться в каждой строке из базы данных, а затем должны хранить каждый аргумент внутри 'self'. – steveha

+0

Вы правы, это для проекта класса, однако, я очень новичок в python, поэтому моя структура кода не самая лучшая на этом языке. Я ценю вашу конструктивную критику, это очень полезно. Я понимаю это, когда я иду ... так что когда у меня будет хороший рабочий код, я уберу его, я думаю. ... так что вы думаете, что мой __init __(), где он принимает kwargs, не может работать с этим .... Нужно ли указывать аргументы для создания экземпляров? – engr007

Смежные вопросы