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转换成整数,是向下 ...
随机推荐
- mod_timer函数及其他定时器函数
当一个定时器已经被插入到内核动态定时器链表中后,我们还能够改动该定时器的expires值.函数mod_timer()实现这一点 改动注冊入计时器列表的handler的起动时间 int mod_time ...
- 设计模式(四)The Factory Pattern 出厂模式
一.简单工厂 定义:定义一个创建对象的接口,可是由其子类决定要实例化的对象是哪一个,工厂方法让类的实例化推迟到子类. 通俗的来讲就是由工厂方法确定一个框架.详细的实现由其子类来完毕. 与简单工厂相比, ...
- C# WPF QQ新消息托盘悬浮窗效果实现
原文:C# WPF QQ新消息托盘悬浮窗效果实现 今天在做一个项目的时候需要这么一个效果,但是网上找了一会发现并没有现成的给我参考(复制),但是呢,我千(到)辛(处)万(抄)苦(袭)想(复)破(制)头 ...
- C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成软件
C# WPF 调用FFMPEG实现“SORRY 为所欲为/王境泽”表情包GIF生成 1,调用ffmpeg将外挂字幕“嵌入”视频中,保存副本: 2,调用ffmpeg将副本视频导出为gif图片. 参考资料 ...
- OpenGL(二十四) VAO、VBO和着色器使用示例
1. 新建一个工程,新建一个头文件Shader.h,内容如下: #ifndef _SHADER_H_ #define _SHADER_H_ #include <vector> #inclu ...
- 百度地图API二:根据标注点坐标范围计算显示缩放级别zoom自适应显示地图
原文:百度地图API二:根据标注点坐标范围计算显示缩放级别zoom自适应显示地图 版权声明:本文为博主原创文章,转载请注明出处. https://blog.csdn.net/liusaint1992/ ...
- AutoEncoder一些实验结果,并考虑
看之前Autoencoder什么时候,我做了一些练习这里:http://ufldl.stanford.edu/wiki/index.php/Exercise:Sparse_Autoencoder .其 ...
- HTTP协议-请求报文
- 命名管道的C#实现
1. 命名管道简介 "命名管道"或"命名管线"(Named Pipes)是一种简单的进程间通信(I P C)机制,Microsoft Windows NT ...
- WPF中的资源(一) - 静态资源和动态资源
原文:WPF中的资源(一) - 静态资源和动态资源 WPF中,每个界面元素都含有一个名为Resources的属性,其存储的是以"键-值"对形式存在的资源,而其子级元素在使用这些资源 ...