Python 类 __init__ 不工作

app*_*ver 5 python sqlalchemy class

这是我在 sqlalchemy 中使用的一些非常简单的代码,但我在这里缺少一些关于类如何工作的基本信息。

class Game(Base):
    __tablename__ = "games"

    id = Column(Integer, primary_key=True)
    a_name = Column(String)

    def __init__(self, **kwargs):
        for k, v in kwargs.iteritems():
             setattr(self, k, v)
        print 'hi'
        self.away_dictionary =  {'name': self.a_name}

    @hybrid_property
    def stuff(self):
        return self.away_dictionary
Run Code Online (Sandbox Code Playgroud)

以下查询有效:

session.query(Game).first().a_name
Run Code Online (Sandbox Code Playgroud)

但以下查询返回错误:

session.query(Game).first().stuff
'Game' object has no attribute 'away_dictionary'
Run Code Online (Sandbox Code Playgroud)

我还有一个更基本的问题,当我查询 Game 类时,它不会打印出“hi”。那么有人可以解释为什么每次使用 Game 实例时都不会打印出“嗨”吗?第二个问题是如何为此类的每个实例构建和访问我想要的 away_dictionary ?

app*_*ver 2

感谢您的评论。是我一个人的问题还是 sqlalchemy 有点令人困惑?

\n\n

无论如何,正如人们在上面指出的那样,__init__当您进行查询时,该方法显然不会被调用。

\n\n
\n

__init__从数据库行重新创建对象时,SQLAlchemy ORM 不会调用。ORM\xe2\x80\x99s 过程有点类似于 Python\n 标准库\xe2\x80\x99s pickle 模块,调用低级__new__\n 方法,然后直接在实例上悄悄恢复属性\n 而不是调用__init__.

\n
\n\n

解决这个问题的方法是添加以下代码:

\n\n
from sqlalchemy.orm import reconstructor\n@reconstructor\nawesome_true_init(self):\n    self.away_dictionary = {'hi': 'i work!!'}\n
Run Code Online (Sandbox Code Playgroud)\n\n

该函数将像真实函数一样运行__init__,并在您创建对象时被调用!

\n