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