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

3 に答える 3

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')
于 2012-08-06T10:39:22.710 に答える
2

はい、作成時にメタクラスを使用してクラス メソッドを変更し、すべての関数を特別なデコレータで装飾できます。あなたの場合、次のようになります。

#! /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
于 2012-08-06T10:32:51.013 に答える
0

デコレータを見ることもできます (たとえば、クラス デコレータを使用して各クラス メソッドにスリープを適用することもできます) が、それ以外の場合は違います。いずれにせよ、スリープさせたい場合は、それについて明示する必要があります。そうすれば、誰かがあなたのコードを再利用したり、タイミングを計ったりしたいと思っても、驚くことは少なくなります...など...

于 2012-08-06T10:33:32.893 に答える