2012-01-21 2 views
6

У меня есть родительский класс, который имеет кучу методов класса:питона: чистый способ, чтобы обернуть каждый метод родительского класса в «с»

class Parent(): 

    @classmethod 
    def methodA(cls): 
     pass 

    @classmethod 
    def methodB(cls): 
     pass 

В моем подклассе, я хотел бы, чтобы обернуть подмножество методов внутри «с». Он должен достичь этого эффекта:

class Child(Parent): 

    @classmethod 
    def methodA(cls): 
     with db.transaction: 
      super(Child, cls).methodA() 

У меня есть куча методов, которые следуют этой схеме и предпочитают не повторяться. Есть ли более чистый способ сделать это?

ответ

3

Кажется, вы должны переместить с db.transaction в базу. Сделать метод в базе, возвращая 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 
+0

@jsbueno, спасибо за добавление @ STATICMETHOD , –