首先,你应该明白
class Foo(object):
bar = ['baz']
and
class Foo(object):
def __init__(self):
self.bar = ['baz']
意味着非常不同的事情,在第一种情况下,bar
是一个类属性,它对于所有实例都是相同的Foo
,以及班级Foo
本身(这是一个实例type
, not Foo
),但在第二个中,bar
是每个实例的一个属性Foo
,并且与该类根本没有关联!如果您尝试两者,并附加到bar
,首先,更改将传播到每个实例Foo
,但对于第二个,只有您附加到的实例才会发生该更改。
你甚至可以同时设置!,你可以这样做:
class Foo(object):
bar = 'baz'
def __init__(self):
self.bar = 'quux'
这是完全明确的。Foo.bar == 'baz'
, Foo().bar == 'quux'
,您可以使用以下命令从实例返回类属性type(Foo()).bar == 'baz'
所以这意味着中的论点__init__
在本教程中,应用于实例User
,但是Column
定义适用于该类
Sqlalchemy 使用class主要是信息。它使用它来生成 SQL,以正确的方式读取和写入数据库。这些定义仅真正适用于 sqlalchemy 转换实例的情况User
数据库调用,或尝试创建实例User
当它从数据库接收行时。
您应该将类属性视为声明类型,实例属性为设置值.
至于问题when实际上是sqlalchemyuses这些信息有一种特殊的魔力Base
,这几乎可以肯定来自sqlalchemy.ext.declarative.declarative_base()
。该函数返回一个class,并且该类使用元类它可以跟踪何时派生出新类Base
被定义。在类定义的末尾,甚至在创建实例之前User
, sqlalchemy 着眼于User
类来查找它需要了解的列属性。