2012-08-06 94 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 Metaclass在这里矫枉过正 – 2012-08-06 11:03:01

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

你可以看看装饰(一个可以使用类装饰到睡眠适用于例如每个类的方法),但除此之外,没有 - 不是真的。不管怎样,如果你想让它睡觉,你应该明确这一点。这样,如果任何人想要重复使用您的代码或做计时等等,会有更少的意外...