2017-04-17 74 views
2

我正在學習Flask中的Web開發。我正在使用SQLAlchemy。一個典型的數據庫對象的結構是這樣的:SQLAlchemy模型變量是類還是對象類型?

class Role(db.Model): 
    __tablename__ = 'roles' 
    id = db.Column(db.Integer, primary_key=True) 
    name = db.Column(db.String(64), unique=True) 
    default = db.Column(db.Boolean, default=False, index=True) 
    permissions = db.Column(db.Integer) 
    users = db.relationship('User', backref='role', lazy='dynamic') 

    def __repr__(self): 
     return '<Role %r>' % self.name 

我的問題是,這些所有的類變量或對象變量?他們不在__init__之內,所以看起來他們是類變量,這似乎很奇怪。任何指針都會很棒!謝謝!

+0

它看起來從常規的Python類代碼不同,但這些確實是實例(對象)的變量。也許有人更深入地瞭解Flask,可以給你更多的信息。我猜這是與對象的繼承有關。 – coralvanda

回答

4

Role類型爲Column的字段確實是類變量。但是,他們將與InstrumentedAttribute角色建設,這發生在declarative.aqi.DeclarativeMeta.__init__()

這就是爲什麼我們定義從Base繼承了元類declarative.aqi.DeclarativeMeta(的declarative_base()的返回值)角色

InstrumentedAttribute數據描述符期間更換,它定義了__get____set__應用於實例字典。因此,我們可以使用它們通過實例進行操作。

在以下示例中,r.name是一個數據描述符,r.name = 'hello'相當於Role.name.__set__(r, 'hello') - >r.__dict__['name'] = 'hello'

r = Role() 
r.name = 'hello' 
相關問題