I am learning Web Development in Flask. I am using SQLAlchemy. A typical database object is structured like so:
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
My question is, are these all class variables or object variables? They are outside the __init__ so it would seem they are class variables, that seems odd though. Any pointers on this would be great! Thanks!
The fields with type Column in Role are indeed class variables. But they would be replaced with InstrumentedAttribute during Role construction, which occurred in declarative.aqi.DeclarativeMeta.__init__()
This is why we define Role inherited from Base with metaclass declarative.aqi.DeclarativeMeta (the return value of declarative_base())
The InstrumentedAttribute is a data descriptor, which defined __get__ and __set__ applied to instance dictionary. As a result, we could use them to do operation through instance.
In the following example, r.name is a data descriptor, r.name = 'hello' is equivalent to Role.name.__set__(r, 'hello') -> r.__dict__['name'] = 'hello'
r = Role()
r.name = 'hello'
                        If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With