python基础--定义装饰器(内置装饰器)
装饰器的定义:
装饰器本质上就是一个python函数,它可以让其它函数在不需要做任何代码改动的前提下增加额外的功能,装饰器的返回值也是一个函数对象。它经常用于有切面需求的场景中,比如-- >插入日志、性能测试、事务处理、缓存、权限校验等场景。装饰器是解决这类问题的绝佳设计,有了装饰器,我们就可以抽离出大量与函数功能本身无关的雷同的代码并且可以重复使用。
装饰器的作用:
就是为已经存在的函数或者对象添加额外的功能
装饰器的写法:
(无参装饰器)
def wrapper(func):
def inner(*args, **kwargs):
print('in inner function')
res = func(*args, **kwargs)
return res
return inner @wrapper
def index(name):
print('my name is %s' % name) index('william')
(有参装饰器):带参数的装饰器和类装饰器属于进阶的内容。在理解这些装饰器之前,最好对函数的闭包和装饰器的接口约定能够有一定的了解。
可以这么理解,当带参数的装饰器被打在某个函数上时,比如@outter('critical')时,它其实就是一个函数,会被马上执行,只要这个它返回的结果是一个装饰器时,那就没有问题,再好好体会一下==
def outter(level):
def wrapper(func):
def inner(*args, **kwargs):
if level == 'info':
print('in inner function')
res = func(*args, **kwargs)
return res
else:
print('level not enough')
return inner
return wrapper @outter('critical')
def index(name):
print('my name is %s' % name) index('william')
(基于类实现的装饰器):装饰器函数其实这样一个接口约束,它必须接受一个__call__对象作为参数,然后返回一个callable对象,在python中一般callable对象都是函数,但是也有例外的,只要某个对象重新加载了__call__()方法,那么这个对象就是callable的。
class Wrapper:
def __init__(self):
self.current_name = []
def __call__(self, func):
def inner(*args, **kwargs):
flag = True
if self.current_name:
print('当前用户已经登陆了')
res = func(*args, **kwargs)
return res
else:
while flag:
user_name = input('user_name:').strip()
password = input('password:').strip()
if user_name == 'william' and password == '':
print('登陆成功...')
res = func(*args, **kwargs)
self.current_name.append(user_name)
return res
else:
print('user_name or password error')
return inner
class Test:
@Wrapper()
def index(self, name):
print('my name is %s' % name)
t = Test()
t.index('william')
像__call__这样前后都带下划线的方法在python中被称为内置方法,有时候也被称为魔法方法,重新加载这些魔法方法一般会改变对象的内部行为,可以让一个类对象拥有被调用的行为。
class Test:
def __call__(self):
print('this is call') t = Test()
t() # this is call
python内置的装饰器:
@staticmethod
将类中的方法设置为静态方法,就是在不需要创建实例对象的情况下,可以通过类名来进行直接引用,来达到将函数功能与实例解绑的效果。
class Test:
@staticmethod
def index(x, y):
print('x + y = %s' % (x+y))
cls = Test()
print('可以通过实例对象来引用')
cls.index(1, 2)
print('通过类名直接引用静态方法')
Test.index(1, 2)
'''
可以通过实例对象来引用
x + y = 3
通过类名直接引用静态方法
x + y = 3
'''
@classmethod
类方法的第一个参数是一个类,是将类的本身作为操作的方法。类方法是被哪个对象调用的,就传入哪个类作为第一个参数进行操作。
class Car:
car = 'audi' @classmethod
def value(cls, category):
print('%s is the %s' % (category, cls.car)) class Bmw(Car):
car = 'Bmw' class Benz(Car):
car = 'Benz' print('通过实例进行调用')
b = Bmw()
b.value('normal')
print('直接用类名进行调用')
Benz.value('NOnormal')
@property
使调用类中方法像引用类中的字段属性一样。被修饰的特性方法,内部可以实现处理逻辑,但是对外部提供统一的调用方式,遵循了统一的访问的原则。
class Test:
name = 'test' def __init__(self, name):
self.name = name @property
def index(self):
print('hello my name is %s' % self.name) cls = Test('file')
print('通过实例来引用属性')
print(cls.name)
print('像引用属性一样调用@property修饰的方法')
cls.index
python基础--定义装饰器(内置装饰器)的更多相关文章
- 二十六. Python基础(26)--类的内置特殊属性和方法
二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...
- python基础12_匿名_内置函数
一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...
- python基础(10)-匿名函数&内置函数
匿名函数 例子 返回两个数的和 def add(x, y): return x + y # 等价于 add = lambda x, y: x + y 返回字典中值最大的key dic = {'a': ...
- Python基础(七)内置函数
今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. 1 2 3 ...
- python基础-匿名函数、内置函数、正则表达式、模块
1. 匿名函数 1.1 有名函数 有名函数:定义了一个函数名,函数名指向内存地址:通过函数名进行访问.函数名加括号就可以运行有名函数,例如:func() def func(x, y, z = 1): ...
- python基础-列表List及内置方法
数据类型之列表-List 用途:用于存一个或多个不同类型的值 定义:通过中括号存值,每个值之间通过逗号进行分隔 l1 = [1,'a',3,'b'] 特性:有序.可变.存多个值的数据类型 常用方法: ...
- 【python基础语法】常用内置函数、关键字、方法和之间的区别(小结)
''' 关键字: False:bool数据类型 True:bool数据类型 None:表示数据的内容为空 and:逻辑运算符:与 or:逻辑运算符:或 not:逻辑运算符:非 in:身份运算符,判断变 ...
- 【python基础】常用的内置函数
python基础之内置函数 参考: http://www.runoob.com/python/python-built-in-functions.html -zip() zip函数接受任意多个(包括0 ...
- python基础-数字类型及内置方法
--数字类型及内置方法 整型-int 用途:多用于年龄.电话.QQ号等变量 定义方法 age = 18 # age = int(18) 常用方式:多用于数学计算 # int(x)将x转换成整数,是向下 ...
随机推荐
- wxWindows
用C++编写跨平台程序 中文版说明 本教程由Gxl117翻译并将继续维护,这是本教程的第一稿,假设发现错误请与我(Email:gxl117@yahoo.com.cn)联系让我能及时修正它.之后还会对这 ...
- SQL语句中使用Group by
参考经典文章:https://blog.csdn.net/liu_shi_jun/article/details/51329472 1.group by 分组 ,每一组数据只有一行,如果group b ...
- ShopNC本地生活o2o网站的源代码,没有域名限制
较前某VIP源代码论坛分享了套ShopNC本地生活o2o站点系统.下载过来却发现根本不能用,所以一直没分享出来.今天咱们这边分享的这套ShopNC本地生活o2o站点源代码,无不论什么的限制,直接ins ...
- Raw-OS备用事件源代码分析
作为分析的内核版本2014-04-15,基于1.05正式版,blogs我们会跟上的内核开发进度的最新版本,如果出现源代码的目光"???"的话.没有深究的部分是理解. Raw-OS官 ...
- spring boot 使用 pageHelper插件
按照github上的教程集成到spring boot pom文件引用需要改一下,教程的pom文件引用: 工程中要用以下方式 <!--分页--> <dependency> < ...
- ef core code first from exist db
目标 为现有数据库生成新的连接,允许只选择部分表 可以处理一些很怪的需求,比如EF升级EF Core(这个可能有其他解),EF.EF Core同时连接一个数据库 我遇到的问题是: 原项目是.net f ...
- WPF - 图形设计器(Diagram Designer)
原文:WPF - 图形设计器(Diagram Designer) OpenExpressApp计划中包括建模工具,计划是采用MetaEdit+模型来作为元模型,使用codeproject的<WP ...
- iphone开发技巧整合
1.NSCalendar用法 -(NSString *) getWeek:(NSDate *)d { NSCalendar *calendar = [[NSCalendar alloc] initWi ...
- Android Camera2 拍照(三)——切换摄像头,延时拍摄和闪光模式
原文:Android Camera2 拍照(三)--切换摄像头,延时拍摄和闪光模式 一.切换摄像头 在前后摄像头之间切换,首先需要关闭之前打开的摄像头,关闭preview,之后重新打开新的摄像头,重新 ...
- WCF调试日志
WCF调试,打不了断点or远程调试时,在配置文件的<configuration>结点下面加一段,就可以在对应位置查看服务器调试日志了,远程调试完毕发送亦可! <system.diag ...