gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 05:56:49 24 4
gpt4 key购买 nike

我正在使用 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com