1. 需求

开发封闭原则:虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被拓展,即:

  • 封闭:已实现的功能代码块
  • 开发:对拓展开发

2. 使用装饰器

2.1 未使用装饰器(原理)

def w1(func):
def inner():
# 验证1
# 验证2
# 验证3
print("----正在验证权限----")
func()
return inner def f1():
print("---f1----") def f2():
print("---f2----") f1 = w1(f1) f1()

----正在验证权限----
---f1----

2.2 使用装饰器

def w1(func):
def inner():
# 验证1
# 验证2
# 验证3
print("----正在验证权限----")
func()
return inner @w1
def f1():
print("---f1----") @w1
def f2():
print("---f2----") f1()
f2()

----正在验证权限----
---f1----
----正在验证权限----
---f2----

3. 再议装饰器

# 定义函数:完成包裹数据
def makeBold(fn):
def wrapped():
print("-----1------")
return "<b>" + fn() + "</b>"
return wrapped # 定义函数:完成包裹数据
def makeItalic(fn):
def wrapped():
print("-----2------")
return "<i>" + fn() + "</i>"
return wrapped @makeBold
@makeItalic
def test3():
print("-----3-----")
return "hello world" s = test3()
print(s)

-----1------
-----2------
-----3-----
<b><i>hello world</i></b>

4. 装饰器执行时间

@w1
def f1():
print("---f1----")

只要Python解释器执行到了这个代码 ,那么就会自动的进行装饰,而不是等到调用的时候才装饰

5. 装饰器对有参数、无参数函数进行装饰

5.1 无参数

def func(functionName):
print("-----func----1-----")
def func_in():
print("---func_in----1----")
functionName()
print("---func_in----2----") print("-----func----2-----")
return func_in @func
def test():
print("----test------") test()

-----func----1-----
-----func----2-----
---func_in----1----
----test------
---func_in----2----

5.2 函数有参数

def func(functionName):
print("-----func----1-----")
def func_in(aa, bb):
print("---func_in----1----")
functionName(aa, bb)
print("---func_in----2----") print("-----func----2-----")
return func_in @func
def test(a, b):
print("----test---a=%d---b=%d---" %(a, b)) test(11, 22)

-----func----1-----
-----func----2-----
---func_in----1----
----test---a=11---b=22---
---func_in----2----

5.3 函数有不定参数

def func(functionName):
print("-----func----1-----")
def func_in(*args, **kargs):
print("---func_in----1----")
functionName(*args, **kargs)
print("---func_in----2----") print("-----func----2-----")
return func_in @func
def test(a, b, c):
print("----test---a=%d---b=%d---c=%d-------" %(a, b, c)) test(11, 22, 33)

-----func----1-----
-----func----2-----
---func_in----1----
----test---a=11---b=22---c=33-------
---func_in----2----

5.4 函数有返回值

def func(functionName):
print("-----func----1-----")
def func_in(*args, **kargs):
print("---func_in----1----")
res = functionName(*args, **kargs)
print("---func_in----2----")
return res print("-----func----2-----")
return func_in @func
def test(a, b, c):
print("----test---a=%d---b=%d---c=%d-------" %(a, b, c))
return "hahaha" res = test(11, 22, 33)
print("res: ", res)

-----func----1-----
-----func----2-----
---func_in----1----
----test---a=11---b=22---c=33-------
---func_in----2----
res: hahaha

6. 通用的装饰器

核心代码:

def func(functionName):
print("-----func----1-----")
def func_in(*args, **kargs):
print("---func_in----1----")
res = functionName(*args, **kargs)
print("---func_in----2----")
return res print("-----func----2-----")
return func_in

验证:

def func(functionName):
print("-----func----1-----")
def func_in(*args, **kargs):
print("---func_in----1----")
res = functionName(*args, **kargs)
print("---func_in----2----")
return res print("-----func----2-----")
return func_in @func
def test(a, b, c):
print("----test---a=%d---b=%d---c=%d-------" %(a, b, c))
return "hahaha" @func
def test2(a):
print("-----test2---%d---"%a) res = test(11, 22, 33)
print("res: ", res) test2(3)

-----func----1-----
-----func----2-----
-----func----1-----
-----func----2-----
---func_in----1----
----test---a=11---b=22---c=33-------
---func_in----2----
res: hahaha
---func_in----1----
-----test2---3---
---func_in----2----

7. 装饰器有参数

from time import ctime, sleep

def timefun_arg(pre="hello"):
def timefun(func):
def wrappedfunc():
print("%s called at %s %s" %(func.__name__, ctime(), pre))
return func()
return wrappedfunc
return timefun @timefun_arg("douzi")
def foo():
print("I am foo") @timefun_arg("python")
def too():
print("I am too") foo()
sleep(2)
too()

foo called at Thu May 9 00:57:58 2019 douzi
I am foo
too called at Thu May 9 00:58:00 2019 python
I am too

8. 综合

from time import ctime, sleep

def timefun_arg(pre="hello"):
print("fun_1")
def timefun(func):
print("fun_in_1")
def wrappedfunc(*args, **kwargs):
print("%s called at %s %s" %(func.__name__, ctime(), pre))
return func(*args, **kwargs)
print("fun_in_2")
return wrappedfunc
print("fun_2")
return timefun @timefun_arg("douzi")
def foo(fname):
print(fname, "I am foo") @timefun_arg("python")
def too():
print("I am too") foo("fname ")
sleep(2)
too()

Python高级笔记(十一)装饰器【面试】的更多相关文章

  1. Python学习笔记012——装饰器

    1 装饰器 1.1装饰器定义 在代码运行期间动态增加功能的方式,称之为“装饰器”(Decorator). 1.2 装饰器分类 装饰器:函数装饰器,类装饰器,函数的装饰器,类的装饰器 装饰器:函数装饰函 ...

  2. Python学习笔记:装饰器

    Python 装饰器的基本概念和应用 代码编写要遵循开放封闭原则,虽然在这个原则是用的面向对象开发,但是也适用于函数式编程,简单来说,它规定已经实现的功能代码不允许被修改,但可以被扩展,即: 封闭:已 ...

  3. python高级编程之装饰器04

    from __future__ import with_statement # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrat ...

  4. python学习笔记:装饰器2

    python的装饰器本质是函数,为了不改变装饰目标函数内部代码而增加额外功能而存在 一.一般装饰函数实例: import datetime def func_name(func):#定义一个装饰函数, ...

  5. Python高级--闭包与装饰器

    前言:在Python中,闭包是一种非常有用的功能!它通常与装饰器一起搭配使用,可以在不改变被装饰函数的功能的基础上,完成更多的功能.如权限认证. 一.如何定义闭包 1.闭包就是两个嵌套的函数,外层函数 ...

  6. python学习笔记(五):装饰器、生成器、内置函数、json

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能,比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里 ...

  7. python学习笔记之装饰器、生成器、内置函数、json(五)

    一.装饰器 装饰器,这个器就是函数的意思,连起来,就是装饰函数,装饰器本身也是一个函数,它的作用是用来给其他函数添加新功能比如说,我以前写了很多代码,系统已经上线了,但是性能比较不好,现在想把程序里面 ...

  8. python学习笔记之装饰器、递归、算法(第四天)

    参考老师的博客: 金角:http://www.cnblogs.com/alex3714/articles/5161349.html 银角:http://www.cnblogs.com/wupeiqi/ ...

  9. Python学习笔记之装饰器原理

    def decorator(fn): def wrapper(): print("询价") fn() print("购买成功!") return wrapper ...

  10. python笔记 - day4-之装饰器

                 python笔记 - day4-之装饰器 需求: 给f1~f100增加个log: def outer(): #定义增加的log print("log") ...

随机推荐

  1. curl请求https资源的时候出现400

    在nginx上配置了一个新的域名, 习惯性地用curl请求看看有没有配置错误 因为是https的, 所以 $curl 'https://test.test.com/' -x 127.0.0.1:443 ...

  2. AD10生成Gerber文件详细步骤

    参考:https://wenku.baidu.com/view/faf0363c195f312b3069a5d2.html

  3. MSF MS12-020RDP漏洞攻击

    Metasploit利用远程桌面协议RDP拒绝访问漏洞(MS12-020) 漏洞描述:BUGTRAQ ID: 52354 CVE ID: CVE-2012-0152 远程桌面协议(RDP, Remot ...

  4. Tomcat+Nginx+Memcached综合案例

    Tomcat+Nginx+Memcached综合案例 说明 通过Nginx解析静态页面并将动态负载均衡调度给后面的多个Tomcat,Tomcat解析java动态程序. 由于http是无状态的协议,你访 ...

  5. redis启动异常处理一例

    rm -rf /var/log/redis/redis.log echo "net.core.somaxconn= 1024" >> /etc/sysctl.conf ...

  6. 【Pet HDU - 4707 】【利用并查集找深度】

    #include<iostream> #include<cstdio> #include<cstring> using namespace std; const i ...

  7. scrapy框架爬取智联招聘网站上深圳地区python岗位信息。

    爬取字段,公司名称,职位名称,公司详情的链接,薪资待遇,要求的工作经验年限 1,items中定义爬取字段 import scrapy class ZhilianzhaopinItem(scrapy.I ...

  8. CentOS7:sorry,that didn't work.please try again!

    参考以下解决方案,重点是vi etc/selinux/config 把 enforcing 改为 disable 应用场景 linux管理员忘记root密码,需要进行找回操作.注意事项:本文基于cen ...

  9. C#WinForm无边框窗体移动----模仿鼠标单击标题栏移动窗体位置

    C#WinForm无边框窗体移动方法.模仿鼠标单击标题栏移动窗体位置 这里介绍俩种办法 方法一:直接通过修改窗体位置从而达到移动窗体的效果 方法二:直接伪装发送单击任务栏消息,让应用程序误以为单击任务 ...

  10. WebKit应用程序开发的起因

    公司的Web管理界面,用起来还可以,但是有一个问题一直无法解决. 在web页面上需要播放视频,由于比较这个功能比较老,不支持web模式播放,只支持CS模式,具体原因及不说了. 于是有了 winform ...