sta*_*ord 6 python syntactic-sugar
我有一个父类,有一堆类方法:
class Parent():
@classmethod
def methodA(cls):
pass
@classmethod
def methodB(cls):
pass
Run Code Online (Sandbox Code Playgroud)
在我的子类中,我想将一个方法的子集包装在"with"中.它应该达到这个效果:
class Child(Parent):
@classmethod
def methodA(cls):
with db.transaction:
super(Child, cls).methodA()
Run Code Online (Sandbox Code Playgroud)
我有一堆遵循这种模式的方法,我宁愿不重复自己.有更清洁的方法吗?
看来你应该将 with db.transaction 移到基础中。在基础中创建一个方法,返回 db.transaction
@staticmethod
def gettransaction(): return db.transaction
Run Code Online (Sandbox Code Playgroud)
然后你可以根据需要让孩子们超载。
然后在基地你做
def methodB(cls):
with cls.gettransaction():
bla ...
Run Code Online (Sandbox Code Playgroud)
这是一个带有虚拟交易的完整工作示例
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()
Run Code Online (Sandbox Code Playgroud)
这导致
enter
A
exit
enter2
A
exit2
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
361 次 |
| 最近记录: |