私は SQLAlchemy を使用していますが、__new__
関数について読んだところです。ここにある他の投稿も読んだ__new__
ので、 との違い__init__
、それらが呼び出される順序、およびそれらの目的と、私にとっての主なメッセージは次のとおりでした: Use __new__
to control the creation of a new instance .
そのことを念頭に置いて、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 への呼び出しが欠落しています) が、アイデアを明確に指摘する必要があります。
今私の質問:これは良い習慣ですか、それとも避けるべきですか? 避けるべき場合: なぜですか?