flask赋予角色的构造函数问题

《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)
构造函数为什么要调用父类的构造函数?是否可以去掉这一句?

阅读 3k
2 个回答

Python与其他OO语言不同,子类的初始化不会自动地调用父类的初始化。使用内置的super可以根据MRO实现父类的代理,在这里就是调用了父类的__init__进行初始化。如果不显式地调用该方法,则父类的属性在子类的实例中就会缺失

class A(object):
    def __init__(self):
        self.a = 'a'

class B(A):
    def __init__(self):
        self.b = 'b'

b = B()
print(b.__dict__)
# {'b': 'b'}

class C(object):
    def __init__(self):
        self.c = 'c'

class D(C):
    def __init__(self):
        super(D, self).__init__()
        self.d = 'd'

d = D()
print(d.__dict__)
# {'c': 'c', 'd': 'd'}

btw, Python中真正的构造函数,应该是__new__

这个不能去掉,这里涉及到了类的继承问题。


通常情况, sqlalchemy 是不提倡自行设置构造函数的,但是这里涉及到了 role 权限的验证问题,用这样的方法更加合理。


你可以参阅这篇文章——http://www.os373.cn/article/38

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题