2016-07-20 192 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