首页 > 解决方案 > 如何装饰一个类,以便我能够在运行时更改类的属性

问题描述

def decorator(cls):
    #code

    return cls

@decorator
class User(db.Model):
    id = db.Column(db.Integer, primary_key=True)
    username = db.Column(db.String(20),nullable=False)
    ssid = db.Column(db.String(20))    

    def __repr__(self):
        return f"User('{self.username}',{self.password})"

我想装饰一个类,这样我就可以在装饰器函数中访问 ssid 的值并向该类添加一个新属性。因为新属性需要 ssid 的值。

user = User(username='prince',ssid='9734ait')
db.session.add(user)

标签: pythonflaskflask-sqlalchemypython-decoratorspython-class

解决方案


在评论中,您说实际目标是在进出课堂时加密密码。Sqlalchemy 使用混合属性提供此功能。这是我的一个项目中的一个例子-

class User(Base):
    __tablename__ = "user"
    id = Column(Integer, primary_key=True)
    username = Column(String(255))
    hashed_password = Column("password", String(255))


    @hybrid_property
    def password(self):
        return self.hashed_password

    @password.setter  # type: ignore
    def password(self, value):
        rounds = 4
        if not isinstance(value, bytes):
            value = value.encode("utf-8")
        self.hashed_password = hashpw(value, gensalt(rounds)).decode("utf-8")

(所以在这种情况下,只有散列的密码存储在数据库中——为了检查密码,你对输入进行散列并将其与 user.password 进行比较)


推荐阅读