装饰器

作者: ju7ran | 来源:发表于2018-06-19 20:25 被阅读0次

装饰器是程序开发中经常会用到的一个功能,开发效率如虎添翼,所以这也是python面试中必问的问题。
装饰器,从字面上理解,就是装饰对象的器件。可以在不修改原有代码的情况下,为被装饰的对象增加新的功能或者附加限制条件。装饰器有很多种,有函数的装饰器,也有类的装饰器。装饰器的语法是:@装饰器名称
@dec
def func():
pass
首先要了解几个知识点
1>重名函数会怎么样?
def test():
print('1')
def test():
print('2')
test()
这个时候会输出什么?
会输出2,后面的会覆盖前面的函数
def foo():
print('test')
foo = lambda x:x+1
foo()
此时foo()的执行结果是什么?
foo会执行匿名函数的内容,而不会执行函数foo,打印test

接下来就是一个比较经典的案例了,有一个大公司,下属的基础平台部负责内部应用程序及API的开发。另外还有上百个业务部门负责不同的业务,这些业务部门各自调用基础平台部提供的不同函数,也就是API处理自己的业务,情况如下:
基础平台部门提供的功能如下:
def f1():
print("业务部门1的数据接口......")
def f2():
print("业务部门2的数据接口......")
def f3():
print("业务部门3的数据接口......")
def f100():
print("业务部门100的数据接口......")

各部门分别调用基础平台提供的功能
f1()
f2()
f3()
f100()
目前公司发展壮大,但是以前没有考虑到验证相关的问题,即:基础平台提供的功能可以被任何人使用。现在需要对基础平台的所有功能进行重构,为平台提供的功能添加验证机制,执行功能前,先进行验证
老大把工作交给A,他是这么做的:
跟每个业务部门交涉,每个业务部门自己写代码,调用基础平台的功能之前先验证。这样一来基础平台就不需要做任何修改了。
当前A被老大开除了
老大又把工作交给B,他是这么做的:
def f1():
# 验证1
# 验证2
# 验证3
def f2():
# 验证1
# 验证2
# 验证3
过了一周B也被开除了
老大又把工作交给C,他是这么做的:
def check_login()
# 验证1
# 验证2
# 验证3
def f1():
check_login()
def f2():
check_login()
老大说写代码要遵循开放封闭的原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,已经实现的功能不允许修改,但可以被扩展
封闭:已实现的功能代码块
开放:对扩展开发
老大给出了方案,
def foo():
def inner():
# 验证1
# 验证2
# 验证3
func()
return inner

@foo
def f1():
pass
@foo
def f2():
pass

看不懂?没关系,接下来写一个简单点的
def w1():
def inner():
print('正在验证权限')
return inner
def f1():
print('f1')

innerFunc = w1()
innerFunc()
这样写什么意思?
w1()函数调用,进入w1函数,返回inner,innerFunc = inner,接下来innerFunc()相当于调用inner()。但这样写有一个问题我的f1函数没有被调用。接下来修改一下代码
def w1(func):
def inner():
print('正在验证权限')
func()
return inner
def f1():
print('f1')
def f2():
print('f2')
innerFunc = w1(f1)
innerFunc()
将f1当成参数传进去,func()就会执行f1()函数。这样就完成了先验证后调用的功能。
但是代码这样写,非常麻烦有没有简单一点的呢?
仅仅需要在函数上面写上@w1就可以了
@w1
def f1():
print('f1')
这个w1等价于 f1 = w1(f1)

相关文章

  • 装饰器

    """@装饰器- 普通装饰器- 带参数的装饰器- 通用装饰器- 装饰器装饰类- 内置装饰器- 缓存装饰器- 类实现...

  • typescript 五种装饰器

    装饰器类型 装饰器的类型有:类装饰器、访问器装饰器、属性装饰器、方法装饰器、参数装饰器,但是没有函数装饰器(fun...

  • python——装饰器详解

    一、装饰器概念 1、装饰器 装饰器:一种返回值也是一个函数的函数,即装饰器。 2、装饰器目的 装饰器的目的:装饰器...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • 装饰器

    装饰器 decorator类装饰器 带参数的装饰器 举例(装饰器函数;装饰器类;有参与无参) https://fo...

  • TypeScript装饰器

    前言 装饰器分类 类装饰器 属性装饰器 方法装饰器 参数装饰器需要在tsconfig.json中启用experim...

  • python之装饰器模版

    装饰器的作用:装饰器即可以装饰函数也可以装饰类。装饰器的原理:函数也是对象 1.定义装饰器 2.使用装饰器假设de...

  • 装饰器实验

    装饰器实验 说明 ts内包含了四个装饰器,类装饰器、属性装饰器、函数装饰器、参数装饰器,本文中测试一下其的使用。 ...

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

网友评论

    本文标题:装饰器

    本文链接:https://www.haomeiwen.com/subject/surzeftx.html