如何解决当使用带有Flask-SQLAlchemy的类声明模型时,为什么列变量不需要“ self”?
例如,以文档https://jsfiddle.net/uj8x4khn/中的简单示例为例:
class User(db.Model):
id = db.Column(db.Integer,primary_key=True)
username = db.Column(db.String(80),unique=True,nullable=False)
email = db.Column(db.String(120),nullable=False)
def __repr__(self):
return '<User %r>' % self.username
我还是python类的新手,所以如果这是一个基本问题,我们深表歉意。
解决方法
这是Flask-SQLAlchemy元编程。类级别的分配定义模式。创建类的实例时,它们将包含某种访问器,以便在self
上引用相同的名称将导致该列中的特定值。之所以可行,是因为sqlalchemy编写了很多代码来实现它。
这不是普通python类的工作方式。您无需为常规python类在类级别定义属性。对于常规类,对self.bar
的访问将检查“ bar”是否在实例本地,然后检查该类上是否存在“ bar”。它就像一个后备,不需要一个。无论哪种情况,设置self.bar
都会在实例中创建一个有效值。如:
>>> class Foo:
... bar = 1
... def get_bar(self):
... return self.bar
... def set_bar(self,val):
... self.bar = val
...
>>> foo = Foo()
>>> print(Foo.bar,foo.bar,foo.get_bar())
1 1 1
>>> foo.set_bar(999)
>>> print(Foo.bar,foo.get_bar())
1 999 999
学习python时,诸如sqlalchemy,numpy和pandas之类的模块背后的魔力可能会使人对语言的工作方式有错误的印象。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。