2012-08-06 75 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

你可以看看裝飾(一個可以使用類裝飾到睡眠適用於例如每個類的方法),但除此之外,沒有 - 不是真的。不管怎樣,如果你想讓它睡覺,你應該明確這一點。這樣,如果任何人想要重複使用您的代碼或做計時等等,會有更少的意外...