2016-07-20 142 views
1

我在Python 3中使用SQLAlchemy,并且很困惑为什么下面的代码能够工作 - 它让我觉得应该是一个对象级别的变量是一个类变量。我已经看到Why is instance variable behaving like a class variable in Python?这与我的问题没有关系。python对象实例变量看起来像一个类变量?

我有一个db模块下面的声明中,我创建的Base一个实例,并在其上设置一个query变量指向SessionFactoryquery_property()

import sqlalchemy as sa 
import sqlalchemy.ext.declarative as sa_ed 


Base = sa_ed.declarative_base() 
engine = sa.create_engine('connection string') 
session_factory = session or sa_orm.scoped_session(sa_orm.sessionmaker(autocommit=False, autoflush=False, bind=engine)) 
Base.query = session_factory.query_property() # make the query_property available in models for querying 

然后我的模型类的声明如下:

import db 

class MyModel(db.Base): 
    id = Column(Integer) 
    # more model stuff 

然后我可以运行通过访问query可变查询如下:

return MyModel.query.filter(MyModel.id == 22).first() 

这并不工作,但它看起来好像存在于类级别的query变量,而不是在对象实例水平,我能够直接通过类访问。

我不理解什么?

+2

我很难理解为什么你会希望'查询'不能在课堂级别......也许你可以编辑你的帖子并解释一下更好吗? – mgilson

+0

我认为'Base = sa_ed.declarative_base()'正在创建'Base'类I.e的一个实例。一个“Base”类型的对象。我现在看到它正在创建一个班级,这更有意义 – user783836

+0

啊......是的,我想这会造成一些混乱。从一个函数(而不是一个类实例)返回一个类是一种有点不正常的模式,但在某些情况下它肯定是有用的。 – mgilson

回答

0

你把父类越早query属性:

Base.query = session_factory.query_property() # make the query_property available in models for querying 

所以query是最肯定的成员的类(Base)。并且由于MyModel继承自Base,MyModel也应该有一个query成员(由于继承的神奇)。

+0

啊好吧,所以'Base'是一个类,不是一个对象!我通过做'Base = sa_ed.declarative_base()'来创建一个'Base'类的实例,即一个'Base'对象。看看我如何使用'Base',我可以看到它是更有意义的类型类 – user783836