@logger
def func:
pass
3.一般用来做什么?
装饰器可以在不修改函数的情况下,增加额外的功能.这是官方给 装饰器的定义
实际上我们会把一些业务功能之外的,附属需求用装饰器来实现.比如:为我们的函数添加 日志记录, 性能监控器, 埋点计数器.大家也都知道,修改写好的函数是非常麻烦并且容易出错的一件事.所以很适合" 在不修改函数内部代码的前提下,为它包装一些额外的功能"也就是装饰器
4.常用的装饰器
staticmethod用来修饰类中的方法,使得该方法可以直接用类名访问,如cls.foo。
classmethod和staticmehod类似,区别在于staticmethod,classmethod会将class传入被修饰的方法中
classA(object):
a =1
def__init__( self):
self.a =2
@staticmethod
deffoo1:
print A.a
@classmethod
deffoo2(cls):
print "class a is", cls.a
print "instance a is", cls.a
property可以将属性的访问和赋值用函数来实现,从而可以在函数里添加参数检查等一些功能,同时外部使用时访问和赋值的方式并不发生变化。注意访问和赋值的方法名是一样的
classA(object):
def__init__( self):
self.__count = 0
@property
defcount( self):
returnself.__count
@count.setter
defcount( self, value):
ifnotisinstance(value, int):
raise ValueError( 'count must be an integer!')
self.__count = value
a = A
print a.count
a.count = 1
print a.count
a.count = "a"# raise ValueError
functools.wraps 用在装饰器的代码里。可以把原始函数的 name等属性复制到wrapper函数中,这样就可以获取到真实函数的 name属性,而不是wrapper
import functools
deflog(text):
defdecorator(func):
@functools.wraps(func)
defwrapper( *args, **kw):
print '%s %s:'%(text, func. __name__)
returnfunc( *args, **kw)
returnwrapper
returndecorator
5.怎么手写一个装饰器
#!/anaconda3/envs/FEALPy/bin python3.7
# -*- coding: utf-8 -*-
# ---
# @File: 装饰器语法.py
# @Author: Bull
# ---
# 定义装饰器函数
# 1.简单装饰器范例
def logger(func):#在python里,一切都是对象
def wrapper(*args,**kw):
print("进入装饰器函数了")
func(*args,**kw)#真正的函数在装饰器重新调用
func(*args, **kw)
print("装饰器功能执行完毕")
return wrapper
@logger#=logger(add)
def add(x,y):
print('进入被修饰的函数')
print(f'{x}+{y}={x+y}')
# add(1,2)
# 2.带参数的装饰器
def say_hello(contry):
def wrapper(func):
def second(*args,**kw):
if contry == 'china':
print("来自装饰器的‘你好’")
elif contry == 'america':
print('来自装饰器的"hello"')
else:
return
func(*args,**kw)
return second
return wrapper
@say_hello('america')
def american:
print("I am from America")
@say_hello('china')
def china:
print('我来自中国')
american
print('*'*30)
china
推荐学习
码同学 Java全栈自动化,开课倒计时!
冲击年薪50W+!