python:最简洁的方法将父类中的每个方法包装在“with”中

时间:2012-01-21 21:38:27

标签: python syntactic-sugar

我有一个有很多类方法的父类:

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()

我有一堆遵循这种模式的方法,我宁愿不重复自己。有更清洁的方法吗?

1 个答案:

答案 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