装饰器的定义:

    装饰器本质上就是一个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基础--定义装饰器(内置装饰器)的更多相关文章

  1. 二十六. Python基础(26)--类的内置特殊属性和方法

    二十六. Python基础(26)--类的内置特殊属性和方法 ● 知识框架 ● 类的内置方法/魔法方法案例1: 单例设计模式 # 类的魔法方法 # 案例1: 单例设计模式 class Teacher: ...

  2. python基础12_匿名_内置函数

    一个二分查找的示例: # 二分查找 示例 data = [1, 3, 6, 7, 9, 12, 14, 16, 17, 18, 20, 21, 22, 23, 30, 32, 33, 35, 36, ...

  3. python基础(10)-匿名函数&内置函数

    匿名函数 例子 返回两个数的和 def add(x, y): return x + y # 等价于 add = lambda x, y: x + y 返回字典中值最大的key dic = {'a': ...

  4. Python基础(七)内置函数

    今天来介绍一下Python解释器包含的一系列的内置函数,下面表格按字母顺序列出了内置函数: 下面就一一介绍一下内置函数的用法: 1.abs() 返回一个数值的绝对值,可以是整数或浮点数等. 1 2 3 ...

  5. python基础-匿名函数、内置函数、正则表达式、模块

    1. 匿名函数 1.1 有名函数 有名函数:定义了一个函数名,函数名指向内存地址:通过函数名进行访问.函数名加括号就可以运行有名函数,例如:func() def func(x, y, z = 1): ...

  6. python基础-列表List及内置方法

    数据类型之列表-List 用途:用于存一个或多个不同类型的值 定义:通过中括号存值,每个值之间通过逗号进行分隔 l1 = [1,'a',3,'b'] 特性:有序.可变.存多个值的数据类型 常用方法: ...

  7. 【python基础语法】常用内置函数、关键字、方法和之间的区别(小结)

    ''' 关键字: False:bool数据类型 True:bool数据类型 None:表示数据的内容为空 and:逻辑运算符:与 or:逻辑运算符:或 not:逻辑运算符:非 in:身份运算符,判断变 ...

  8. 【python基础】常用的内置函数

    python基础之内置函数 参考: http://www.runoob.com/python/python-built-in-functions.html -zip() zip函数接受任意多个(包括0 ...

  9. python基础-数字类型及内置方法

    --数字类型及内置方法 整型-int 用途:多用于年龄.电话.QQ号等变量 定义方法 age = 18 # age = int(18) 常用方式:多用于数学计算 # int(x)将x转换成整数,是向下 ...

随机推荐

  1. lua转换etcd应答

    local function decodeNodes(nodes) local table = {} for _, value in ipairs(nodes) do if value.nodes t ...

  2. 如何获得iframe中元素的值

    在Web开发时,很多时候会遇到一个问题.我在一个页面嵌入了iframe,并且我想获得这个iframe页面某个元素的值.那么该如何实现这个需求呢? 先来看下演示: 效果演示     iframe1中文本 ...

  3. [实时更新]jquery完整版下载

    jquery-2.1.0   注!不再支持IE 6/7/8 直接引用地址:  开发版地址1: <script src="http://code.jquery.com/jquery-2. ...

  4. WPF安装打印机驱动后PrintDialog 执行打印事件

    原文:WPF安装打印机驱动后PrintDialog 执行打印事件 WPF可以很好的利用流文档来实现打印预览和PrintDialog 实现打印功能,但是我在这只是写了一个很简单的打印功能演示. Page ...

  5. 亲串 (hdu 2203 KMP)

    亲串 Time Limit: 3000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submiss ...

  6. 从零开始学习 asp.net core 2.1 web api 后端api基础框架(三)-创建Data Transfer Object

    原文:从零开始学习 asp.net core 2.1 web api 后端api基础框架(三)-创建Data Transfer Object 版权声明:本文为博主原创文章,未经博主允许不得转载. ht ...

  7. react项目实践——(4)依赖安装与配置

    1. 修改package.json,添加需要安装的包 { "name": "myapp", "version": "1.0.0&q ...

  8. Lizcst Software Lab新秀品牌上线!

    科友微电机是Lizcst Software Lab旗下品牌新秀,专业经营各种微型特种直流电机.微型发电机.微型电机配件.航模车模船模素材.教学科学小制作材料的网店.本店秉承Lizcst Softwar ...

  9. linux系统中ls命令的用法

    普通文件: -,f目录文件: d链接文件(符号链接): L设备文件:字符设备:c块设备:b命名管道: p套接字文件: s linux文件时间戳 时间分为三种类型:创建时间,修改时间:open访问时间: ...

  10. 备份一个个人用的WPF万能转换器

    public class CommonCoverter : IValueConverter { /// 转换器参数语法: key1,value1 key2,value2 ... [other,defu ...