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?
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
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
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