《flask web开发》这本书的9.2提到定义默认的用户角色。
class User(UserMixin, db.Model):
__tablename__ = 'users'
id = db.Column(db.Integer, primary_key=True)
email = db.Column(db.String(64), unique=True, index=True)
username = db.Column(db.String(64), unique=True, index=True)
role_id = db.Column(db.Integer, db.ForeignKey('roles.id'))
password_hash = db.Column(db.String(128))
confirmed = db.Column(db.Boolean, default=False)
def __init__(self, **kwargs):
super(User, self).__init__(**kwargs)
if self.role is None:
if self.email == current_app.config['FLASK_ADMIN']:
self.role = Role.query.filter_by(permission=0xff).first()
if self.role is None:
self.role = Role.query.filter_by(default=True).first()
super(User, self).__init__(**kwargs)
构造函数为什么要调用父类的构造函数?是否可以去掉这一句?
Python与其他OO语言不同,子类的初始化
不会自动地
调用父类的初始化。使用内置的super可以根据MRO
实现父类的代理,在这里就是调用了父类的__init__进行初始化。如果不显式地
调用该方法,则父类的属性在子类的实例中就会缺失
。btw, Python中真正的
构造函数
,应该是__new__