2012-08-06 5 views
2

메서드를 실행할 때마다 일시 중지를 추가하려고합니다. 자동으로 수행하는 방법이 있습니까? 사실 나는 이런 식으로 뭔가했습니다 : 각 메서드 실행 후 일시 중지 만들기

import time 
def test (arg): 
    print arg 
    time.sleep(0.1) 
class Foo (Object): 
    def __init__ (self, a, b): 
     self.a = a 
     self.b = b 
     time.sleep(0.1) 
    def printer (self, arg): 
     print arg 
     time.sleep(0.1) 

답변

3

기본적으로 @Fedor Gogolev의 해결책 인 과 같은 점을 제외하고는 메타 클래스 대신 클래스 데코레이터를 사용합니다.

import time 
import inspect 
import functools 

def sleep(f): 
    @functools.wraps(f)  
    def wrapper(*args, **kwargs): 
     result = f(*args, **kwargs) 
     time.sleep(0.1) 
     return result 
    return wrapper 

def sleeper(cls): 
    for name, method in inspect.getmembers(cls, inspect.ismethod): 
     setattr(cls, name, sleep(method)) 
    return cls 

@sleeper 
class Foo(object): 
    def __init__(self, a, b): 
     self.a = a 
     self.b = b 
    def printer(self, arg): 
     print arg 


f = Foo(1,2) 
f.printer('hi') 
+0

+1 메타 크래스가 과도합니다. –

2

예, 당신의 창조에 클래스 메소드를 수정 metaclasses를 사용하고, 특별한 장식으로 모든 기능을 장식 할 수 있습니다. 귀하의 경우는 다음과 같이있을 수 :

#! /usr/bin/env python 
#-*- coding:utf-8 -*- 

import time 

from inspect import isfunction 
from functools import wraps 

def sleep_decorator(func): 
    @wraps(func) 
    def inner(*args, **kwargs): 
     result = func(*args, **kwargs) 
     time.sleep(0.1) 
     return result 
    return inner 

class BaseFoo(type): 

    def __new__(cls, name, bases, dct): 
     for name in dct: 
      if isfunction(dct[name]): 
       dct[name] = sleep_decorator(dct[name]) 
     return type.__new__(cls, name, bases, dct) 


class Foo (object): 
    __metaclass__ = BaseFoo 

    def __init__ (self, a, b): 
     self.a = a 
     self.b = b 

    def printer (self, arg): 
     print arg 
0

당신은 더 그렇지 않으면 (하나의 예를 들어 각 클래스 메소드에 잠을 적용 할 클래스 장식을 사용할 수 있습니다) 장식을보고 있지만, 수 - 정말. 한 가지 방법 또는 다른 방법으로, 만약 당신이 그것을 자고 싶다면, 그것에 대해 분명히해야합니다. 그런 식으로 누군가가 코드를 재사용하거나 타이밍 등을하고 싶다면 덜 놀라게 될 것입니다 ...

관련 문제