我有一个有很多类方法的父类:
class Parent():
@classmethod
def methodA(cls):
pass
@classmethod
def methodB(cls):
pass
在我的子类中,我想将一个方法的子集包装在“with”中。它应该达到这个效果:
class Child(Parent):
@classmethod
def methodA(cls):
with db.transaction:
super(Child, cls).methodA()
我有一堆遵循这种模式的方法,我宁愿不重复自己。有更清洁的方法吗?
答案 0 :(得分:3)
看来你应该将db.transaction移动到基础中。 在base中创建一个方法,返回db.transaction
@staticmethod
def gettransaction(): return db.transaction
然后在/如果需要的话,在子项中重载它。
然后在基地做
def methodB(cls):
with cls.gettransaction():
bla ...
这是一个带有虚拟交易的完整工作示例
class transact:
def __enter__(a):
print "enter"
def __exit__(a,b,c,d):
print "exit"
class transact2:
def __enter__(a):
print "enter2"
def __exit__(a,b,c,d):
print "exit2"
class Parent():
@staticmethod
def gettrans():
return transact()
def methodA(cl):
with cl.gettrans():
print "A"
class Child(Parent):
pass
@staticmethod
def gettrans():
return transact2()
p=Parent()
p.methodA()
c=Child()
c.methodA()
这导致
enter
A
exit
enter2
A
exit2