【发布时间】:2015-08-10 22:24:32
【问题描述】:
我正在尝试将我的代码从一个大函数重写为 oop。
如果我有这个,它会在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:test@localhost: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:test@localhost:3306/test', echo=False)
session = sessionmaker(bind=engine)
}
private insert() {
//...
session.commit();
}
}
如何在 python 中做到这一点? 对不起,愚蠢的问题,我是 python 新手。
--------------------- 编辑:
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:test@localhost: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()
【问题讨论】:
-
我不知道这是否是您的问题的直接原因,但您似乎在缩进中混合了制表符和空格。这可能会导致令人惊讶和不寻常的错误,因为解析器不会将制表符解释为四个空格,即使它在您的文本编辑器中看起来是这样的。请仅使用空格。
-
只是让您知道 OOP 并不意味着“将所有内容都放在类中”。类应该是真实世界对象的数字表示。类不应该(在完美的世界中)只是函数的集合。
-
我使用 PyCharm 自动代码格式 - 它修复了空格/制表符。
-
您的解决方案是什么?将 cosntructor 的内容放到
if __name__ == '__main__':?
标签: python oop constructor class-variables