2012-01-21 39 views
6

Tôi có một tầng lớp phụ huynh mà có một loạt các phương pháp lớp:python: cách sạch để quấn mỗi phương thức trong lớp cha mẹ trong một "với"

class Parent(): 

    @classmethod 
    def methodA(cls): 
     pass 

    @classmethod 
    def methodB(cls): 
     pass 

Trong lớp con của tôi, tôi muốn quấn một tập hợp con của các phương thức bên trong "có". Nó sẽ đạt được hiệu ứng này:

class Child(Parent): 

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

Tôi có một loạt các phương pháp theo mẫu này và không muốn lặp lại bản thân mình. Có cách nào sạch hơn để làm việc này không?

Trả lời

3

Dường như bạn nên di chuyển với db.transaction vào cơ sở. Thực hiện một phương pháp trong các cơ sở, trả lại db.transaction

@staticmethod 
def gettransaction(): return db.transaction 

sau đó bạn quá tải nó trong những đứa trẻ như/nếu cần thiết.

Trong cơ sở sau đó bạn làm

def methodB(cls): 
    with cls.gettransaction(): 
     bla ... 

Dưới đây là một ví dụ làm việc hoàn chỉnh với một giao dịch giả

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

kết quả này trong

enter 
A 
exit 
enter2 
A 
exit2 
+0

@jsbueno, nhờ thêm @ staticmethod . –

Các vấn đề liên quan