我正在使用 SQLAlchemy,我刚刚阅读了有关该__new__
功能的信息。我还阅读了这里的其他帖子,__new__
所以我知道它们的区别__init__
、它们被调用的顺序、它们的目的以及对我来说主要信息是:用于__new__
控制新实例的创建。
所以考虑到这一点,当我使用 SQLAlchemy 并想要检索一个实例(如果它不存在则创建一个实例,例如检索一个用户对象,我通常这样做:
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 的调用),但它应该清楚地指出这个想法。
现在我的问题是:这是一个好习惯还是我应该避免这种做法?如果应该避免:为什么?