2016-07-20 9 views
1

私はPython 3でSQLAlchemyを使用していますが、なぜ次のコードが動作するのか混乱しています。クラス変数として動作するオブジェクトレベルの変数が何であるかがわかります。私はWhy is instance variable behaving like a class variable in Python?を見ましたが、私の質問には関係していません。pythonオブジェクトのインスタンス変数は、クラス変数のように見えますか?

次のように私は私がBaseのインスタンスを作成し、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 

を指し、それにquery変数を設定するdbモジュールに次の宣言は、私のモデルクラスは、その後に宣言されています:

import db 

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

次のように私は、その後query変数にアクセスしてクエリを実行できます。

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

これは機能しますが、それは私がクラスを介して直接アクセスすることができる午前としてquery変数がオブジェクトインスタンス・レベルでクラスレベルで存在していないかのように見えます。

私は何を理解していませんか?

+2

私は、あなたがなぜ 'query'がクラスレベルではないと期待しているのか理解できていないのです...あなたの投稿を編集し、それをより良く説明できるでしょうか? – mgilson

+0

私は 'Base = sa_ed.declarative_base()'が 'Base'クラスのインスタンスを作成していると考えました。型 'Base'のオブジェクトです。私は今それがより意味をなさないクラスを作成しているのを見る – user783836

+0

ああ...はい、それはいくつかの混乱のためになるだろうと思います。関数から(クラスインスタンスではなく)クラスを返すのは幾分異常なパターンですが、場合によっては間違いなく便利です。 – mgilson

答えて

0

あなたは、以前の親クラスにqueryプロパティを置く:

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

のでqueryが最も確実クラス(Base)のメンバーです。 MyModelBaseから継承しているため、MyModelにはqueryというメンバーも存在する必要があります(継承の魔法のため)。

+0

ああ大丈夫なので、 'Base'はオブジェクトではないクラスです! 'Base = sa_ed.declarative_base()'を実行すると仮定しました。私は 'Base'クラスのインスタンス、つまり' Base'オブジェクトを作成していました。私が 'Base'をどのように使っているかを見てみると、それは型のクラス – user783836

関連する問題