Python SQLAlchemy ORM___;init__;方法vs

Python SQLAlchemy ORM___;init__;方法vs,python,sqlalchemy,Python,Sqlalchemy,在中,以下代码作为将映射到表的类的示例给出: >>> from sqlalchemy import Column, Integer, String >>> class User(Base): ... __tablename__ = 'users' ... ... id = Column(Integer, primary_key=True) ... name = Column(String) ... fullname = Colu

在中,以下代码作为将映射到表的类的示例给出:

>>> from sqlalchemy import Column, Integer, String
>>> class User(Base):
...     __tablename__ = 'users'
...
...     id = Column(Integer, primary_key=True)
...     name = Column(String)
...     fullname = Column(String)
...     password = Column(String)
...
...     def __init__(self, name, fullname, password):
...         self.name = name
...         self.fullname = fullname
...         self.password = password
...
...     def __repr__(self):
...        return "<User('%s','%s', '%s')>" % (self.name, self.fullname, self.password)
>来自sqlalchemy导入列,整数,字符串
>>>类用户(基本):
...     __tablename_uu='users'
...
...     id=列(整数,主键=True)
...     名称=列(字符串)
...     fullname=列(字符串)
...     密码=列(字符串)
...
...     定义初始化(self、name、fullname、password):
...         self.name=名称
...         self.fullname=fullname
...         self.password=密码
...
...     定义报告(自我):
...        返回“”%(self.name、self.fullname、self.password)

如果在实例化类时,用户在
\uuuu init\uuuuu
方法中设置了
名称
全名
密码
,那么将它们声明为
对象(即类变量)有什么意义?我不明白SQLAlchemy如何以及何时能够使用这些信息——它是否以某种方式通过用户继承的“基类”传递给SQLAlchemy模块?(我认为通过声明一个从另一个类继承的类,不可能以这种方式将信息传递给单元)。

首先,您应该理解这一点

class Foo(object):
    bar = ['baz']

意思非常不同,在第一种情况下,
bar
是一个类属性,对于
Foo
的所有实例都是相同的,类
Foo
本身(它是
type
的一个实例,不是
Foo
),但是在第二种情况下,
bar
Foo
的每个实例的属性,并且与类完全没有关联!。如果您同时尝试这两种方法,并将其附加到
,对于第一种方法,更改将传播到
Foo
的每个实例,但是对于第二种方法,只有您附加到的实例才会有该更改

您甚至可以同时设置这两个选项!,你可以做:

class Foo(object):
    bar = 'baz'

    def __init__(self):   
        self.bar = 'quux'
这是毫无疑问的
Foo.bar=='baz'
Foo().bar=='quox'
,您可以从具有
type(Foo())的实例返回class属性。bar=='baz'

这意味着本教程中
\uuuu init\uuu
中的参数适用于
User
的实例,但
定义适用于类

Sqlalchemy主要使用类信息。它使用它,以便能够生成SQL,该SQL以正确的方式从数据库进行读取和写入。这些定义仅适用于sqlalchemy将
User
的实例转换为数据库调用,或从数据库接收行时尝试创建
User
的实例的情况

您应该将类属性视为声明类型,将实例属性视为设置值


至于sqlalchemy何时实际使用该信息,在
Base
中有一种特殊的魔力,这几乎可以肯定来自
sqlalchemy.ext.declarative.declarative\u Base()
。该函数返回一个类,该类使用一个元类,该元类可以跟踪从
Base
派生的新类何时定义。在类定义的末尾,甚至在创建
User
的实例之前,sqlalchemy就会查看
User
类,以找到它需要知道的列属性。

现在我更清楚了!最后一点,您将解释如何使用元类来跟踪从
Base
派生的新类,这仍然非常令人困惑。你知道哪里有一个很好的解释来解释它是如何工作的吗?@MikeVella:你是在看一般元类的解释(如果有),还是特别是SQLAlchemy是如何使用元类的,请参见和。希望这些能有所帮助。如果您有更具体的问题,请随时开始新的问题。
class Foo(object):
    bar = 'baz'

    def __init__(self):   
        self.bar = 'quux'