Advertisement
Woobinda

@decorator

Sep 2nd, 2016
120
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 1.15 KB | None | 0 0
  1. """
  2. Декоратор считающий количество вызовов декторируемого метода класса
  3. """
  4.  
  5.  
  6. class tracer(object):
  7.     def __init__(self, func):
  8.         self.calls = 0
  9.         self.func = func
  10.     def __call__(self, *args, **kwargs):
  11.         self.calls += 1
  12.         print('calls %s to %s' % (self.calls, self.func.__name__))
  13.         return self.func(*args, **kwargs)
  14.     def __get__(self, instance, owner):
  15.         def wrapper(*args, **kwargs):
  16.             return self(instance, *args, **kwargs)
  17.         return wrapper
  18.  
  19.  
  20. """
  21. Этот же декоратор на основе функции
  22. """
  23. def tracer(func):
  24.     calls = 0
  25.     def onCall(*args, **kwargs):
  26.         nonlocal calls
  27.         calls += 1
  28.         print('call %s to %s' % (calls, func.__name__))
  29.         return func(*args, **kwargs)
  30.     return onCall
  31.  
  32.  
  33. class Person:
  34.     def __init__(self, fname, lname, pay):
  35.         self.fname = fname
  36.         self.lname = lname
  37.         self.pay = pay
  38.  
  39.     @tracer
  40.     def giveRaise(self, percent):
  41.         self.pay += self.pay * percent // 100
  42.         return '%s pay now in %s' % (self.fname, self.pay)
  43.  
  44.     @tracer
  45.     def fullName(self):
  46.         return self.fname + ' ' + self.lname
  47.  
  48.  
  49. @tracer
  50. def func(a, b, c):
  51.     return a + b + c
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement