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

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)

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

Joh*_*erg 3

看来你应该将 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)