def decorator(fn):
def wrapper():
print("询价")
fn()
print("购买成功!") return wrapper def apple():
print("购买苹果") def orange():
print("购买橘子") def potato():
print("购买土豆") ap = decorator(apple)
ap() ora = decorator(orange)
ora() po = decorator(potato)
po()

运行结果

(1) 装饰器相当于使用闭包函数封装公共部分的函数:

在decorator函数中, 定义一个闭包函数 wrapper, 而wrapper函数内部除了输出公共部分print("询价") print("购买成功!")

(2) decorator装饰器传入形参fn作为函数返回

参数fn传入装饰器后, 在闭包函数内部作为函数调用fn()

切记: wrapper作为闭包函数,必须返回

(3) 自定义不同函数 apple, orange, potato ...,作为实参传入装饰器

2 . 赋值给变量

ap = decorator(apple)  

1 . 调用

ap()

(4)修改

  直接在函数上方使用@decorator就可以调用装饰器,无需再将赋值给变量

调用函数即可

 def decorator(fn):
def wrapper():
print("询价")
fn()
print("购买成功!") return wrapper @decorator
def apple():
print("购买苹果") @decorator
def orange():
print("购买橘子") @decorator
def potato():
print("购买土豆") # ap = decorator(apple)
# ap()
#
# ora = decorator(orange)
# ora()
#
# po = decorator(potato)
# po()
apple()
orange()
potato()

(5)添加可变参数

由于调用的函数参数是不固定的,所以传入装饰器的参数必须是可变参数 *args ,其中args是自定义的,可根据实际情况改为具有实际意义的变量

(6)添加关键字参数:**kwargs中的kwargs可自定义

(5)总结

装饰器的作用其实就是封装复用的代码,并且可以将新增的公共代码写在装饰器中,避免了在函数内部扩展代码。秉承了函数的封闭性和开放性,即对修改是封闭的,对扩展是开放的 , 需要在装饰器传入可变参数和关键字参数,调用的函数才能传参。

Python学习笔记之装饰器原理的更多相关文章

  1. Python学习笔记:装饰器

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

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

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

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

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

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

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

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

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

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

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

  7. Python学习系列之装饰器

    装饰器的作用 装饰器用于装饰某个函数.方法或者类,它可以让这个函数执行之前或者执行之后做一些操作 手工实现一个装饰器 def outer(some_func): #装饰器 $1 def inner() ...

  8. python学习之day5,装饰器,生成器,迭代器,json,pickle

    1.装饰器 import os import time def auth(type): def timeer(func): def inner(*args,**kwargs): start = tim ...

  9. python学习日记(装饰器的补充)

    如何返回被装饰函数的函数名及注释? 问题及实现 先看典型的装饰器: def wrapper(f):#装饰器函数,f是被装饰函数 def inner(*args,**kwargs): '''执行函数之前 ...

随机推荐

  1. SYSAUX表空间如何清理

    ############################################################ 操作方案################################### ...

  2. LoadRunner录制脚本-基础

    1.启动LoadRunner.没有脚本则创建脚本,有脚本则可以运行压力测试 2.点击Create/Edit Scripts,如下图,可新建或打开已有脚本 3.选择要测系统的协议 4.生成脚本分四步 5 ...

  3. 新建虚拟机_WIN8 64位系统_启动报错Directory "EZBOOT" not found

    准备工作:下载win8 64 镜像文件 1.虚拟机安装win8 64位操作系统,新建虚拟机步骤同XP系统 2.BIOS设置CD/ROM启动,但启动报错,如下,由于镜像文件超过4G,无法从虚拟机安装,需 ...

  4. jvm的调优

    首先我们要知道jvm的调优,主要是对那些部分的优化.通过jvm内存模型我们可以,首先是分析遇到的问题,然后通过一些工具或者手段找到问题所在,然后通过一定的措施解决问题,下面我们也将按着这个思路来给出具 ...

  5. Python开发【模块】:aiohttp(一)

    AIOHTTP 用于asyncio和Python的异步HTTP客户端/服务器 主要特点: 支持客户端和HTTP服务器. 支持服务器WebSockets和 客户端WebSockets开箱即用,没有回调地 ...

  6. 连连看java版

    主界面 import java.awt.BorderLayout; import java.awt.Color; import java.awt.Container; import java.awt. ...

  7. Servlet----------通过 GenericServlet 开发Servlet

    通过继承GenericServlet抽象类.只需要重写service()方法即可.(这个知识点了解即可) package cn.servlet; import java.io.IOException; ...

  8. 为什么mysql 5.7.24启停不显示错误信息?log-error_verbosity参数

    关键词:log-error_verbosity ,mysql启停没有信息,mysql启停不显示错误信息,mysql不显示启停信息 原因就是因为 log-error_verbosity = 2 被设置成 ...

  9. centos7.6 安装与配置 MongoDB yum方式

    1 创建yum源文件,添加以下内容 vim /etc/yum.repos.d/mongodb-org-4.0.repo [mongodb-org-4.0] name=MongoDB Repositor ...

  10. idea structure窗口

    https://blog.csdn.net/qq_19934363/article/details/87994000