我正在学习Flask中的Web开发。我正在使用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 :(得分:5)
Column
中类型为Role
的字段确实是类变量。但是在InstrumentedAttribute
declarative.aqi.DeclarativeMeta.__init__()
替换
这就是为什么我们定义从Base
继承的元素与元类declarative.aqi.DeclarativeMeta
(declarative_base()的返回值)
InstrumentedAttribute
是一个数据描述符,它定义了应用于实例字典的__get__
和__set__
。因此,我们可以使用它们通过实例进行操作。
在以下示例中,r.name
是数据描述符,r.name = 'hello'
等同于Role.name.__set__(r, 'hello')
- &gt; r.__dict__['name'] = 'hello'
r = Role()
r.name = 'hello'