2015-05-28 4 views
-2

Я пытаюсь переписать свой код с одной большой функцией на oop.Python: определить переменную объекта без инициализации

Если у меня есть это, аварии на session.add(a1) # Unresolved reference:

from sqlalchemy.ext.declarative import declarative_base 
from sqlalchemy import * 
from sqlalchemy.orm import * 

Base = declarative_base() 

class Address(Base): 
    __tablename__ = 'address' 
    id = Column(Integer, primary_key=True) 
    street = Column(String, nullable=False) 
    city = Column(String, nullable=False) 
    user = relationship('User', back_populates="address") 

class Main(): 
    def __init__(self): 
     engine = create_engine('mysql://test:[email protected]:3306/test', echo=False) 
     Session = sessionmaker(bind=engine) 
     session = Session() 

    def insert(self): 
     # INSERT 
     a1 = Address() 
     a1.street = "Str 123" 
     a1.city = "City WTF" 

     session.add(a1) # Unresolved reference 
     session.commit() 

if __name__ == '__main__': 
    Main().run() 

Я понимаю. session - это локальный объект в конструкторе (__init__).

Но как я могу поместить объект «прямо в класс»? В Java я что-то вроде:

public class Main { 
    Engine engine; 
    Session session; 
    public Main() {} 
     engine = create_engine('mysql://test:[email protected]:3306/test', echo=False) 
     session = sessionmaker(bind=engine) 
    } 
    private insert() { 
     //... 
     session.commit(); 
    } 
} 

Как я могу сделать это в Python? Извините за глупый вопрос, я новичок python.

--------------------- EDIT:

class Main(): 
    engine = None # What I write here? How declare uninitialized object? 
    session = None # What I write here? 
    def __init__(self): 
     engine = create_engine('mysql://test:[email protected]:3306/test', echo=False) 
     Session = sessionmaker(bind=engine) 
     session = Session() 

    def insert(self): 
     # INSERT 
     a1 = Address() 
     a1.street = "Str 123" 
     a1.city = "City WTF" 
     self.session.add(a1) # Is possible to call session without "self"? 
     self.session.commit() 
+0

Я не знаю, если это является прямой причиной вашей проблемы, но вы, кажется, смешивая вкладки и пробелы в вашем отступа , Это может вызвать неожиданные и необычные ошибки, потому что вкладка не интерпретируется парсером как четыре пространства, даже если это похоже на текстовый редактор. Используйте только пробелы. – Kevin

+2

Просто потому, что вы знаете, что ООП не означает «придерживаться всего в классах». Класс должен быть цифровым представлением объекта реального мира. Классы не должны (в идеальном мире) просто быть набором функций. – IanAuld

+0

Я использую формат автоматического кода PyCharm - он фиксирует пробел/вкладки. – martin

ответ

2

Методы на вашем Main класса выглядят, как они относятся к классу Address.

engine = create_engine('mysql://test:[email protected]:3306/test', echo=False) 
session = sessionmaker(bind=engine) 

class Address(Base): 
    __tablename__ = 'address' 
    id = Column(Integer, primary_key=True) 
    street = Column(String, nullable=False) 
    city = Column(String, nullable=False) 
    # you are missing some fields you'll need eventually 
    state = Column(String, nullable=False) 
    zip_code = Column(String, nullable=False) # this can be an int if you don't have to worry about Canadian zips which have letters in them 
    user = relationship('User', back_populates="address") 

    def __init__(self, street, city, state, zip_code, user): 
     self.street = street 
     self.city = city 
     self.state = state 
     self.zip_code = zip_code 
     self.user = user 

    def insert(self, session): 
     # INSERT 
     session.add(self) 
     session.commit() 

Вы не должны создавать сессию в рамках одного класса, потому что тогда вы будете создавать новый каждый раз, когда вы создать экземпляр класса. Сохраните сеанс в глобальном пространстве и передайте его вашим методам/функциям, которые нуждаются в нем в качестве параметра (не использовать).

Теперь все в нужном месте, вы можете использовать его как это:

from models import session, Address 
addr = Address('123 Test St.', 'Sometown', 'NY', '12345', some_user) 
addr.insert(session) 
4

В Java вы могли бы сделать this.session = ...; в Python это self.session = ....

1

Вы инициализируете локальную переменную session в методе __init__ и вызываете ее в методе, для которого эта переменная неизвестна.

использование self.varialbe в обоих случаях вместо

1

использование self.session
, чтобы сохранить переменные сессии

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