Python类初始化不工作

2024-04-26 05:47:41 发布

您现在位置:Python中文网/ 问答频道 /正文

这是我在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

以下查询有效:

session.query(Game).first().a_name

但以下查询返回错误:

session.query(Game).first().stuff
'Game' object has no attribute 'away_dictionary'

我还有一个更基本的问题,当我查询游戏类时,它不会打印出“嗨”。所以有人能解释一下为什么每次我使用一个游戏实例时都不打印“hi”吗?第二个问题是,我如何为这个类的每个实例构建和访问我想要的away_字典?


Tags: 实例nameselfgamedictionarysqlalchemysessiondef
3条回答

您没有在上面的查询中创建游戏实例,只传递游戏类对象。因此,init构造函数永远不会被调用。 如果您需要一个游戏实例进行查询,则需要这个:session.query(Game()).first().stuff

啊哈。我正要指出,奇怪的是stuff没有找到,我希望away_dictionary没有找到。。。你编辑了你的文章并修改了你引用的错误信息。确实是away_dictionary没有找到,因为它通常是在类的__init__()方法中创建的,并且__init__()没有被调用。

通常,在创建实例时会调用__init__(),但是在SQLAlchemy的查询中使用该类时,它会跳过__init__()方法。我怀疑这与SQLAlchemy的declarative_mapper工作原理有关,但我对SQLAlchemy的了解还不够,根本不知道如何修复它。如果我发现了,我稍后会编辑这个答案并告诉你。

但现在,您可能不应该依赖于在SQLAlchemy模型对象中调用的__init__()方法(也就是从Base派生的任何东西)。看看你能不能用其他方式来构造你的代码。

谢谢你的评论。只是我还是sqlalchemy有点让人困惑?

不管怎样,正如人们在上面指出的,__init__方法显然在执行查询时不被调用。

The SQLAlchemy ORM does not call __init__ when recreating objects from database rows. The ORM’s process is somewhat akin to the Python standard library’s pickle module, invoking the low level __new__ method and then quietly restoring attributes directly on the instance rather than calling __init__.

解决方法是添加以下代码:

from sqlalchemy.orm import reconstructor
@reconstructor
awesome_true_init(self):
    self.away_dictionary = {'hi': 'i work!!'}

这个函数将像一个真正的__init__函数,并在创建对象时被调用!!

相关问题 更多 >