【发布时间】:2018-10-16 02:11:59
【问题描述】:
我有一个与数据库交互的类,因此在该类的每个成员方法之前和之后都有重复的操作(建立会话、提交、关闭会话)。
如下:
class UserDatabaseManager(object):
DEFAULT_DB_PATH = 'test.db'
def __init__(self, dbpath=DEFAULT_DB_PATH):
dbpath = 'sqlite:///' + dbpath
self.engine = create_engine(dbpath, echo=True)
def add_user(self, username, password):
Session = sessionmaker(bind=self.engine)
session = Session()
# <============================== To be wrapped
user = User(username, password)
session.add(user)
# ==============================>
session.commit()
session.close()
def delete_user(self, user):
Session = sessionmaker(bind=self.engine)
session = Session()
# <============================== To be wrapped
# Delete user here
# ==============================>
session.commit()
session.close()
用函数包装器抽象出重复会话调用的惯用方法是什么?
我更喜欢通过在 UserDatabaseManager 中声明一个私有 _Decorators 类并在其中实现包装函数来使用装饰器,但是这样的类将无法访问 self.engine 的实例属性外部类。
【问题讨论】:
-
@Luke 实际上,我对您的两个答案都投了赞成票,但目前很难说哪种方法更好,而且两者都非常相似。在做出决定之前,我一直想看看这两种方法如何在我的项目中扩展几天。但是非常感谢您回答我的问题!
标签: python decorator wrapper python-decorators