python - 如何用python类中的方法替换装饰器

标签 python methods decorator

假设我有以下代码,我在其中使用 get_duration 装饰器打印出方法持续了多长时间。

import datetime
import time

def get_duration(function):
  def wrapper(*args, **kwargs):
    start = datetime.datetime.now()
    print "starting process %s()" %function.__name__
    function(*args, **kwargs)
    end = datetime.datetime.now()
    print "Process lasted: ", end - start
  return wrapper

class Operations(object):

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

  @get_duration
  def add(self):
    time.sleep(1)
    print self.a + self.b

  @get_duration
  def sub(self):
    time.sleep(1)
    print self.a - self.b


my_class = Operations(2, 98)
my_class.add()
my_class.sub()

输出

>> starting process add()
>> 100
>> Process lasted:  0:00:01.000260
>> starting process sub()
>> -96
>> Process lasted:  0:00:01.001161

我可以用类方法或类似的方法替换它吗(伪代码如下):

my_class = Operations(2, 98)
my_class.add.get_duration #runs add(), prints duration
my_class.add #runs add() does not print duration

最佳答案

要完全按照您的意愿行事,您可以通过可调用类修饰此方法。

class TimeElapser  :
   def __init__(self, function_to_wrap) :
       self.__call__ = function_to_wrap
       self.get_duration = get_duration(function_to_wrap)

例子:

class Foo :

    @TimeElapser
    def do_something(self, ....) :
       ...

foo = Foo()
foo.do_something() #Does something
foo.do_something.get_duration() # Does something and print duration

关于python - 如何用python类中的方法替换装饰器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20481027/

相关文章:

限制调用次数的 Python 装饰器

python - 为什么python中的字符串拼接顺序对速度影响很大?

python - 使用 turtle.onclick() 改变一个变量

python - Windows 上的 Python 中的快速文件夹大小计算

r - 如果已经有一个同名的函数,则定义一个 S4 方法

c++ - C++中的C函数

c++ - 无法在 C++ 的派生类中重载基类方法

javascript - 如何使用装饰器向类添加函数

python - 如何使用 Python 设置本地 HTTP 服务器

python - 用于转换函数参数的装饰器