网站实现语言转换技术上该怎么做,免费下载网页模板,wordpress更新是乱码,计算机毕设代做网站1、Python装饰器简介
python的装饰器就是一个Python函数#xff0c;它可以让其他函数在不需要做任何代码变动的前提下增加额外功能#xff0c;装饰器的返回值也是一个函数对象。简单的说装饰器就是一个用来返回函数的函数。
它经常用于有切面需求的场景#xff0c;比如…1、Python装饰器简介
python的装饰器就是一个Python函数它可以让其他函数在不需要做任何代码变动的前提下增加额外功能装饰器的返回值也是一个函数对象。简单的说装饰器就是一个用来返回函数的函数。
它经常用于有切面需求的场景比如插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题代码很好地重用。简单理解装饰器的作用就是为已经存在的对象添加额外的功能。
2、Python内置装饰器
3、Python装饰器语法及原理
python提供了符号作为装饰器的语法糖使我们更方便的应用装饰函数。但使用语法糖要求装饰函数必须return一个函数对象。因此我们将上面的func函数使用内嵌函数包裹并return。
装饰器相当于执行了装饰函数use_loggin后又返回被装饰函数bar,因此bar()被调用的时候相当于执行了两个函数。等价于use_logging(bar)()def use_logging(func):
def _deco():
print(%s is running % func.__name__)
func()
return _deco
use_logging
def bar():
print(i am bar)
bar()
4、Python装饰器的使用
1装饰器修饰带参数方法def use_logging(func):
def _deco(a,b):
print(%s is running % func.__name__)
func(a,b)
return _deco
use_logging
def bar(a,b):
print(i am bar:%s%(ab))
bar(1,2)
2装饰器修饰不确定参数个数方法def use_logging(func):
def _deco(*args,**kwargs):
print(%s is running % func.__name__)
func(*args,**kwargs)
return _deco
use_logging
def bar(a,b):
print(i am bar:%s%(ab))
use_logging
def foo(a,b,c):
print(i am bar:%s%(abc))
bar(1,2)
foo(1,2,3)
3带参数的装饰器#! /usr/bin/env python
# -*- coding:utf-8 -*-
# __author__ TKQ
def use_logging(level):
def _deco(func):
def __deco(*args, **kwargs):
if level warn:
print %s is running % func.__name__
return func(*args, **kwargs)
return __deco
return _deco
use_logging(levelwarn)
def bar(a,b):
print(i am bar:%s%(ab))
bar(1,3)
# 等价于use_logging(levelwarn)(bar)(1,3)
4使用functools.wraps解决原函数的元信息问题import functools
def use_logging(func):
functools.wraps(func)
def _deco(*args,**kwargs):
print(%s is running % func.__name__)
func(*args,**kwargs)
return _deco
use_logging
def bar():
print(i am bar)
print(bar.__name__)
bar()
#result:
#bar is running
#i am bar
#bar
5、装饰器同时兼容带参数和不带参数的情况import functools
def use_logging(arg):
if callable(arg):#判断传入的参数是否是函数不带参数的装饰器调用这个分支
functools.wraps(arg)
def _deco(*args,**kwargs):
print(%s is running % arg.__name__)
arg(*args,**kwargs)
return _deco
else:#带参数的装饰器调用这个分支
def _deco(func):
functools.wraps(func)
def __deco(*args, **kwargs):
if arg warn:
print warn%s is running % func.__name__
return func(*args, **kwargs)
return __deco
return _deco
use_logging(warn)
# use_logging
def bar():
print(i am bar)
print(bar.__name__)
bar()
6、类的装饰器的使用class loging(object):
def __init__(self,levelwarn):
self.level level
def __call__(self,func):
functools.wraps(func)
def _deco(*args, **kwargs):
if self.level warn:
self.notify(func)
return func(*args, **kwargs)
return _deco
def notify(self,func):
# logit只打日志不做别的
print %s is running % func.__name__
loging(levelwarn)#执行__call__方法
def bar(a,b):
print(i am bar:%s%(ab))
bar(1,3)
#继承扩展类的装饰器
class email_loging(Loging):一个loging的实现版本可以在函数调用时发送email给管理员def __init__(self, emailadminmyproject.com, *args, **kwargs):
self.email email
super(email_loging, self).__init__(*args, **kwargs)
def notify(self,func):
# 发送一封email到self.email
print %s is running % func.__name__
print sending email to %s %self.email
email_loging(levelwarn)
def bar(a,b):
print(i am bar:%s%(ab))
bar(1,3)