2015-10-26 61 views
4

下面是一个例子方法,这是一个Python类中:Python的装饰访问自

def publish_aggregate_account_group_stats(self, account_group_token): 
    message = { 
     "type": "metrics-aggregate-account-group-stats", 
     "accountGroupToken": account_group_token 
    } 
    try: 
     self._get_writer().write(message) 
    except: 
     self._put_cache(message) 

还有就是在我的类中的方法,所有运行try/except了一把,那我认为可以DRYed向上或清洗通过简单地创建一个装饰器来为我处理。我只是不确定装饰者如何通过访问self来查看/工作。

回答

1

像这样将工作:

from contextlib import contextmanager 
class Test(object): 
    def __init__(self): 
     self.j = set() 

    @contextmanager 
    def handle_exc(self, msg): 
     try: 
      yield 
     except: 
      print('adding to internal structure:', msg) 
      self.j.add(msg) 

    def test(self): 
     m = 'snth' 
     with self.handle_exc(m): 
      raise Exception('error') 

一个装饰是艰难的,因为你在函数内部创造价值在这里使用,所以外部装饰将永远不会知道它们,除非你找到一个方法来传播它们(通过某种例外或某物)。