2016-07-20 18 views
1

Ich verwende SQLAlchemy in Python 3 und bin verwirrt, warum der folgende Code funktioniert - es sieht für mich aus, wie eine Objekt-Level-Variable als Klassenvariable handeln soll. Ich habe Why is instance variable behaving like a class variable in Python? gesehen, die nicht auf meine Frage bezogen ist.Python Objektinstanzvariable sieht wie eine Klassenvariable aus?

Ich habe folgende Erklärungen in einem db Modul, in dem ich eine Instanz von Base erstellen und eine query Variable damit, dass sich auf die SessionFactory Punkte query_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 

Meine Modellklassen werden dann wie folgt deklariert:

import db 

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

dann kann ich Abfragen ausführen, indem Sie die query Variable Zugriff wie folgt:

Dies funktioniert, aber es sieht so aus, als ob die query Variable auf der Klassenebene und nicht auf der Objektinstanzenebene existiert, da ich direkt über die Klasse darauf zugreifen kann.

Was verstehe ich nicht?

+2

Ich habe eine schwere Zeit zu verstehen, warum Sie erwarten würden, "Abfrage" zu _not_ auf Klassenebene sein ... Vielleicht können Sie Ihren Beitrag bearbeiten und erklären, dass besser? – mgilson

+0

Ich dachte, dass 'Base = sa_ed.declarative_base()' eine Instanz der 'Base' Klasse I.e. ein Objekt vom Typ Base. Ich sehe jetzt, dass es eine Klasse schafft, die mehr Sinn macht – user783836

+0

Ahh ... Ja, ich nehme an, das würde für einige Verwirrung sorgen. Es ist ein etwas abnormales Muster, eine Klasse von einer Funktion (statt einer Klasseninstanz) zurückzugeben, aber in manchen Fällen ist es definitiv nützlich. – mgilson

Antwort

0

Sie setzen die query Eigenschaft auf die Elternklasse früher:

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

So query ist definitiv ein Mitglied von eine Klasse (Base). Und da MyModel von Base erbt, sollte MyModel auch ein query Mitglied haben (wegen der Magie der Vererbung).

+0

Ah okay, so 'Base' ist eine Klasse kein Objekt! Ich nahm an, indem ich 'Base = sa_ed.declarative_base()' ausführte. Ich erstellte eine Instanz der 'Base'-Klasse, d. H. Ein' Base'-Objekt. Wenn ich mir ansehe, wie ich "Base" benutze, kann ich sehen, dass es sinnvoller wäre, vom Typ class zu sein – user783836

Verwandte Themen