装饰器定义
- 装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能,就是拓展原来函数功能的一种函数
- 在不修改被装饰器对象源代码以及调用方式的前提下为被装饰对象添加新功能,如增加函数的执行时间、为函数打印日志等
装饰器分类
Python内置装饰器
- staticmethod:把类中的方法定义为静态方法,使用staticmethod装饰的方法可以使用类或者类的实例对象来调用,不需要传入self
class Human(object):
"""docstring for Human"""
def __init__(self):
super(Human, self).__init__()
@staticmethod
def say(message):
if not message:
message = 'hello'
print(f'I say {message}')
def speak(self, message):
self.say(message)
Human.say(None)
human = Human()
human.speak('hi')
- classmethod:把类中的方法定义为类方法,使用classmethod装饰的方法可以使用类或者类的实例对象来调用,并将该class对象隐式的作为第一个参数传入
class Human(object):
"""docstring for Human"""
def __init__(self):
super(Human, self).__init__()
self.message = '111'
def say(message):
if not message:
message = 'hello'
print(f'I say {message}')
@classmethod
def speak(cls, message):
if not message:
message = 'hello'
cls.say(message)
human = Human()
human.speak('hi')
class Human(object):
"""docstring for Human"""
def __init__(self, value):
super(Human, self).__init__()
self._age = value
@property
def age(self):
return self._age
human = Human(20)
print(human.age)
无参数的装饰器
import datetime
import time
def calc_spend_time(func):
def new_func(*args, **kargs):
start_time = datetime.datetime.now()
result = func(*args, **kargs)
end_tiem = datetime.datetime.now()
print(f"result: {result}, used: {(end_tiem - start_time).microseconds} s")
return new_func
@calc_spend_time
def calc_add(a, b):
time.sleep(10)
return a + b
def print_log(func):
"""日志装饰器"""
def inner(*args, **kwargs):
print(f"方法{func.__name__}的参数是:{args, kwargs}")
return func(*args, **kwargs)
return inner
@print_log
def test_1(a, b):
return a + b
print(test_1(4, 5))
带参数的装饰器
import datetime
def calc_spend_time(author):
def first_deco(func):
def new_func(*args, **kargs):
start_time = datetime.datetime.now()
result = func(*args, **kargs)
end_tiem = datetime.datetime.now()
print(f"result: {result}, used: {(end_tiem - start_time).microseconds} s")
return new_func
return first_deco
@calc_spend_time('author_1')
def calc_add(a, b):
return a + b
@calc_spend_time('author_2')
def calc_diff(a, b):
return a - b
calc_add(a=1, b=2)
calc_diff(1, 2)
彩蛋
被装饰器装饰过的函数除了上面发生的变化之外还有什么变化?怎么解决呢?
会导致函数名发生变化,解决如下:
方法一:
def set_func(func):
def call_func(*args, **kwargs):
print('')
return func(*args, **kwargs)
call_func.__name__ = func.__name__
return call_func
@set_func
def test_2():
print('name test')
print(test_2.__name__)
方法二:
import functools
def set_func(func):
@functools.wraps(func)
def call_func(*args, **kwargs):
print('')
return func(*args, **kwargs)
return call_func
@set_func
def test_3():
print('name test')
print(test_3.__name__)
如有其他疑问欢迎评论,共同学习,加油~
|