2017-04-17 1 views
2

Ich lerne Web-Entwicklung in Flask. Ich benutze SQLAlchemy. Ein typisches Datenbankobjekt ist wie folgt strukturiert:Sind SQLAlchemy Modellvariablen Klasse oder Objekttyp?

Meine Frage ist, sind das alle Klassenvariablen oder Objektvariablen? Sie sind außerhalb der __init__, so dass es scheinen würde, dass sie Klassenvariablen sind, die jedoch seltsam erscheinen. Irgendwelche Hinweise dazu wären großartig! Vielen Dank!

+0

Es sieht anders aus als regulärer Code Python-Klasse, aber die sind in der Tat Instanz (Objekt) Variablen. Vielleicht könnte jemand, der Flask auf einer tieferen Ebene kennt, Ihnen mehr Informationen darüber geben, warum das so ist. Ich vermute, das hat etwas mit der Vererbung des Objekts zu tun. – coralvanda

Antwort

4

Die Felder mit dem Typ Column in Role sind tatsächlich Klassenvariablen. Aber sie würden mit InstrumentedAttribute während Rollenkonstruktion ersetzt werden, die in declarative.aqi.DeclarativeMeta.__init__() aufgetreten

diesem Grund haben wir Rolle von Base mit metaclass declarative.aqi.DeclarativeMeta (der Rückgabewert von declarative_base()) geerbt definieren

Die InstrumentedAttribute ist ein Datendeskriptor , die und __set__ auf Instanz-Wörterbuch angewendet definiert. Als Ergebnis könnten wir sie verwenden, um eine Operation durch die Instanz auszuführen.

Im folgenden Beispiel r.name ein Datendeskriptor ist, ist r.name = 'hello' entspricht Role.name.__set__(r, 'hello') ->r.__dict__['name'] = 'hello'

r = Role() 
r.name = 'hello' 
Verwandte Themen