Я пытаюсь переписать свой код с одной большой функцией на 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()
Я не знаю, если это является прямой причиной вашей проблемы, но вы, кажется, смешивая вкладки и пробелы в вашем отступа , Это может вызвать неожиданные и необычные ошибки, потому что вкладка не интерпретируется парсером как четыре пространства, даже если это похоже на текстовый редактор. Используйте только пробелы. – Kevin
Просто потому, что вы знаете, что ООП не означает «придерживаться всего в классах». Класс должен быть цифровым представлением объекта реального мира. Классы не должны (в идеальном мире) просто быть набором функций. – IanAuld
Я использую формат автоматического кода PyCharm - он фиксирует пробел/вкладки. – martin