Python 为什么从基继承的SQLAlchemy类不需要构造函数?

Python 为什么从基继承的SQLAlchemy类不需要构造函数?,python,sqlalchemy,Python,Sqlalchemy,使用从Base类继承的SQLAlchemy对象,我可以为构造函数中未定义的变量向类传递参数: from sqlalchemy.ext.declarative import declarative_base Base = declarative_base() class User(Base): __tablename__ = 'users' id = Column(Integer, Sequence('user_id_seq'), primary_key=True) n

使用从
Base
类继承的SQLAlchemy对象,我可以为构造函数中未定义的变量向类传递参数:

from sqlalchemy.ext.declarative import declarative_base

Base = declarative_base()

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))

    def __repr__(self):
        return "<User(name='%s', fullname='%s', password='%s')>" % (
                                self.name, self.fullname, self.password)

ed_user = User(name='ed', fullname='Ed Jones', password='edspassword')
来自sqlalchemy.ext.declarative import declarative\u base
Base=声明性_Base()
类用户(基本):
__tablename_uu='users'
id=列(整数,序列('user\u id\u seq'),主键=True)
名称=列(字符串(50))
全名=列(字符串(50))
密码=列(字符串(12))
定义报告(自我):
返回“”%(
self.name、self.fullname、self.password)
ed_user=user(name='ed',fullname='ed Jones',password='edspassword')
当然,如果我尝试将这样的参数传递给另一个类,以同样的方式设置类变量,我会得到一个错误:

In [1]: class MyClass(object):
   ...:     i = 2
   ...:     

In [2]: instance = MyClass(i=9)
---------------------------------------------------------------------------
TypeError                                 Traceback (most recent call last)
<ipython-input-2-6d3ec8445b00> in <module>()
----> 1 instance = MyClass(i=9)

TypeError: object.__new__() takes no parameters
[1]中的
:类MyClass(对象):
…:i=2
...:     
在[2]中:instance=MyClass(i=9)
---------------------------------------------------------------------------
TypeError回溯(最近一次调用上次)
在()
---->1实例=MyClass(i=9)
TypeError:object.\uuuuu new\uuuuuu()不接受任何参数

SQLalchemy在耍什么花招?他们为什么不使用构造函数(即
\uuu init\uuu
方法)?

您在这里问了两个问题

首先,你问“SQLAlchemy在耍什么把戏”。使用一个名为动态创建
Base
类的概念,在幕后还有更多的工作要做

但实际上,您需要知道的是SQLAlchemy正在
Base
类中定义一个构造函数(尽管是以一种迂回的方式),用于动态设置元素。实际上是该方法的实现(至少在回答此问题时存在):

基本上,这是,并自动设置新对象上的属性。您可以想象
Base
类如下所示,但请记住它实际上有点复杂(您可以阅读代码以了解更多):

如果您创建了上述代码,那么您创建的任何继承自
Base
的类都将自动获得自动填充属性属性的功能,只要该属性已在类上定义。这是因为典型的Python面向对象继承结构:如果不在
用户
对象上定义方法,Python将查找在基类上定义的方法(在本例中为
基类
方法),并将使用该方法。这适用于
\uuu init\uu
方法,就像其他方法一样

您的第二个问题是“为什么他们不使用构造函数(即
\uuuuu init\uuuuu
方法)?”好吧,正如我们上面所描述的,他们使用!他们将
\u声明性\u构造函数
方法设置为
类的
\u初始化
属性,有效地设置对象构造的默认逻辑。当然,这只定义了默认值;如果您想

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))

    def __init__(self, name):
        self.name = name
        self.fullname = name
        self.password = generate_new_password()

# The following will now work...
ed_user = User('ed')
mark_user = User(name='mark')

# ...but this will not...
problem_user = User(name='Error', fullname='Error M. McErrorson', password='w00t')

你在这里问了两个问题

首先,你问“SQLAlchemy在耍什么把戏”。使用一个名为动态创建
Base
类的概念,在幕后还有更多的工作要做

但实际上,您需要知道的是SQLAlchemy正在
Base
类中定义一个构造函数(尽管是以一种迂回的方式),用于动态设置元素。实际上是该方法的实现(至少在回答此问题时存在):

基本上,这是,并自动设置新对象上的属性。您可以想象
Base
类如下所示,但请记住它实际上有点复杂(您可以阅读代码以了解更多):

如果您创建了上述代码,那么您创建的任何继承自
Base
的类都将自动获得自动填充属性属性的功能,只要该属性已在类上定义。这是因为典型的Python面向对象继承结构:如果不在
用户
对象上定义方法,Python将查找在基类上定义的方法(在本例中为
基类
方法),并将使用该方法。这适用于
\uuu init\uu
方法,就像其他方法一样

您的第二个问题是“为什么他们不使用构造函数(即
\uuuuu init\uuuuu
方法)?”好吧,正如我们上面所描述的,他们使用!他们将
\u声明性\u构造函数
方法设置为
类的
\u初始化
属性,有效地设置对象构造的默认逻辑。当然,这只定义了默认值;如果您想

class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))

    def __init__(self, name):
        self.name = name
        self.fullname = name
        self.password = generate_new_password()

# The following will now work...
ed_user = User('ed')
mark_user = User(name='mark')

# ...but this will not...
problem_user = User(name='Error', fullname='Error M. McErrorson', password='w00t')

基类可能用来接受任意参数,然后将其与字段匹配。基类可能用来接受任意参数,然后将其与字段匹配。
class User(Base):
    __tablename__ = 'users'
    id = Column(Integer, Sequence('user_id_seq'), primary_key=True)
    name = Column(String(50))
    fullname = Column(String(50))
    password = Column(String(12))

    def __init__(self, name):
        self.name = name
        self.fullname = name
        self.password = generate_new_password()

# The following will now work...
ed_user = User('ed')
mark_user = User(name='mark')

# ...but this will not...
problem_user = User(name='Error', fullname='Error M. McErrorson', password='w00t')