python - __new__ 是检索 SQLAlchemy 对象的好方法吗

标签 python sqlalchemy python-2.x

我正在使用 SQLAlchemy,并且刚刚阅读了有关 __new__ 函数的信息。我还阅读了这里有关 __new__ 的其他帖子,因此我知道与 __init__ 的区别,它们被调用的顺序及其目的以及对我来说的主要信息是:< em>使用__new__来控制新实例的创建。

因此,考虑到这一点,当我使用 SQLAlchemy 并想要检索一个实例(如果尚不存在则创建一个实例,例如检索 User 对象)时,我通常会这样做:

user = DBSession.query(User).filter(User.id==user_id).first()
if not user:
    user = User()

这将返回当前用户或给我一个新用户。现在,随着我对魔法的新了解,我认为这样的事情可能是个好主意:

user = User(id=user_id)

在我的数据库类中,我会调用:

def __new__(cls, id=0):
    if id:
        user = DBSession.query(User).filter(User.id==id).first()
    if not id or not user:
        user = super(User, cls).__new__(cls, id=id)
    return user

现在这段代码只是一个快速草稿(例如缺少对 super 的调用),但它应该清楚地指出这个想法。

现在我的问题:这是一个好的做法还是我应该避免这种情况?如果应该避免:为什么?

最佳答案

根据您的问题和评论,我建议您不要这样做,因为您似乎没有任何理由这样做,而且您似乎也不明白自己在做什么。

您说您将放置某些代码__new__。但是在什么__new__中呢?如果你有这个:

class User(Base):
    def __new__(cls, id=0):
        if id:
            user = DBSession.query(User).filter(User.id==id).first()
        if not user:
            user = User()
        return user

。 。 。然后,当您尝试创建 User 实例时,其 __new__ 将尝试创建另一个实例,依此类推,导致无限递归。

使用user = User.__init__()解决不了任何问题。 __init__ 始终返回 None,因此您将只是尝试创建一个 None 对象。

__new__ 的适当用例是当您通过执行 SomeClass() 实例化类时想要更改返回的对象类型。很少需要这样做。最常见的情况是当您想要创建一个模仿内置类型(例如 dict)的用户定义类时,但即使如此,您也可能不需要这样做。

如果您的代码无需覆盖 __new__ 即可工作,请勿覆盖 __new__。仅当您遇到无法通过其他方式解决的特定问题或任务时才覆盖它。

关于python - __new__ 是检索 SQLAlchemy 对象的好方法吗,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12133641/

相关文章:

python - 自由(): invalid pointer Aborted (core dumped)

python - 如何在 SQLAlchemy 中的一对一关系中按混合属性对同一张表进行两次引用排序?

python - 为什么在 python 中输出这个单引号和大括号?

python - 如何在字符串中打印函数?

python - 使用 uv4l raspicam 驱动程序设置 SimpleCV

python - 如何在Python中正确编码?

python - 获取 SQLAlchemy 中已创建记录的 ID

python - 为什么我的flask-sqlalchemy 删除查询失败

python - 从字符串中删除子字符串时出现意外结果

linux - Python 找不到 mongoengine 模块