装饰器

什么是装饰器?

​ 装饰器是一个函数,主要作用是用来给包装另一个函数或者类

包装的目的是不改变原函数名(或类名)的情况下改变或添加被包装对象的功能

函数装饰器

是指装饰器是一个函数,传入的是一个函数,返回的也是一个函数

语法:

def 装饰器函数名(参数):
语句块
return 函数对象
@张诗琪函数名
def 函数名(形参列表):
语句块

示例:

# 此示例示意装饰器函数的定义方式及装饰器来装饰另一个函数
# 的语法 def mydeco(fn):
def fx():
print("++++++++++++++++")
print('----------------')
return fx def myfunc():
'''此函数将作为被装饰函数'''
print("myfunc被调用") # 原理是让myfunc重新绑定mydeco返回回来的函数
myfunc = mydeco(myfunc) myfunc()
myfunc()
myfunc()
# 此示例示意装饰器函数的定义方式及装饰器来装饰另一个函数
# 的语法 def mydeco(fn):
def fx():
print("++++++++++++++++")
print('----------------')
return fx @mydeco
def myfunc():
'''此函数将作为被装饰函数'''
print("myfunc被调用") # myfunc上的@mydeco 等同于在
# 此处加上 myfunc=mydeco(myfunc) myfunc()
myfunc()
myfunc()
# 此示例示意装饰器函数的定义方式及装饰器来装饰另一个函数
# 的语法 def mydeco(fn):
def fx():
print("++++++++++++++++")
fn() # 调用以前的被装饰函数
print('----------------')
return fx @mydeco
def myfunc():
'''此函数将作为被装饰函数'''
print("myfunc被调用") myfunc()
myfunc()
myfunc()
# 此示例示意装饰器的用途和作用
# 模拟银行项目
# 业务: 存钱和取钱
# ----- 小李以下小写写的装饰器-----
def privileged_check(fn):
def fx(n, yuan):
print("正在检查权限..... OK!")
fn(n, yuan) # 调用被装饰函数
return fx def send_message(fn):
def fy(n, x):
fn(n, x)
print("正在发送给...", n)
return fy # ------
@privileged_check
def savemoney(name, x):
print(name, '存钱', x, "元") @privileged_check
@send_message
def withdraw(name, x):
print(name, "取钱", x, "元") # ----------
savemoney("小王", 200)
savemoney("小赵", 400) withdraw("小钱", 500)

函数的文档字符串

函数内第一次末赋值给任何变量的字符串是此函数的文档字

符串

语法:

 def 函数名(参数列表):
'函数的文档字符串'
语句块

示例:

def hello(name):
'''这是一个向别人问好的函数
name 绑定人的姓名
'''
pass

说明:

文档字符串通常用来说明本函数的功能的使用方法

函数的文档字符串绑定在函数对象的__doc__ 属性上

函数的 doc 属性

__doc__属性用于绑定函数的文档字符串

函数定义语句的完整的语法:

[@装饰器名1]

[@装饰器名2]

...

def 函数名([位置形参], [*元组形参], [命名关键字形参]

,[**字典形参]):

'文档字符串'

语句块

Python开发【第十四篇】装饰器的更多相关文章

  1. Python之路(第十一篇)装饰器

    一.什么是装饰器? 装饰器他人的器具,本身可以是任意可调用对象,被装饰者也可以是任意可调用对象. 强调装饰器的原则:1 不修改被装饰对象的源代码 2 不修改被装饰对象的调用方式 装饰器的目标:在遵循1 ...

  2. 跟着老男孩教育学Python开发【第四篇】:模块

    双层装饰器示例 __author__ = 'Golden' #!/usr/bin/env python # -*- coding:utf-8 -*-   USER_INFO = {}   def ch ...

  3. Python开发【第四篇】:模块

    双层装饰器示例 __author__ = 'Golden' #!/usr/bin/env python # -*- coding:utf-8 -*-     USER_INFO = {}     de ...

  4. Python开发【第四篇】: 三大器和内置函数

    内容概要 函数名 闭包 迭代器 生成器 推导式与表达式 内置函数 装饰器 初识递归 1.函数名 函数名的运用: 函数名是一个变量,但它是一个特殊的变量,与括号配合可以执行函数的变量. 01. 函数名的 ...

  5. Python开发【第四篇】语句与函数

    语句 statement 语句是由一些表达式组成,通常一条语句可以独立的执行来完成一部分事情,并且形成结果. 多条语句写在一行内要用分号分开 例子: print('hello world') #这是一 ...

  6. Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  7. 【转】Android UI开发第二十四篇——Action Bar

    Action bar是一个标识应用程序和用户位置的窗口功能,并且给用户提供操作和导航模式.在大多数的情况下,当你需要突出展现用户行为或全局导航的activity中使用action bar,因为acti ...

  8. Python开发【第四篇】:Python基础之函数

    三元运算 三元运算(三目运算),是对简单的条件语句的缩写. ? 1 2 3 4 5 # 书写格式   result = 值1 if 条件 else 值2   # 如果条件成立,那么将 “值1” 赋值给 ...

  9. Python开发【第四篇】函数

    函数的作用 函数可以让编程逻辑结构化以及模块化 无论是C.C++,Java还是Python,函数是必不可少的知识点,也是很重要的知识点,函数是完成一个功能的代码块,使用函数可以使逻辑结构变得更加清晰以 ...

  10. Python 学习 第十四篇:命名元组

    Python的元组不能为元组内部的数据进行命名,而 collections.namedtuple 可以来构造一个含有字段名称的元组类,命名元组可以通过逗号+字段名来获取元素值: collections ...

随机推荐

  1. Node.js官方文档:到底什么是阻塞(Blocking)与非阻塞(Non-Blocking)?

    译者按: Node.js文档阅读系列之一. 原文: Overview of Blocking vs Non-Blocking 译者: Fundebug 为了保证可读性,本文采用意译而非直译. 这篇博客 ...

  2. InvalidOperationException: Operations that change non-concurrent collections must have exclusive access. A concurrent update was performed on this collection and corrupted its state. The collection's

    InvalidOperationException: Operations that change non-concurrent collections must have exclusive acc ...

  3. spoon(kettle)基本配置(连接Mysql和Oracle)

    1.下载spoon包和驱动 可以去spoon官网下载需要的spoon版本 官网 :http://kettle.pentaho.org/ 下载的最新版本的kettle是:pdi-ce-7.1.0.0-1 ...

  4. ansible自动化运维01

    ansible是基于Python开发,集合了众多运维工具(puppet.cfengine.chef.func.fabric)的优点,实现了批量系统配置.批量程序部署.批量运行命令等功能.ansible ...

  5. 逆向破解之160个CrackMe —— 023-024

    CrackMe —— 023 160 CrackMe 是比较适合新手学习逆向破解的CrackMe的一个集合一共160个待逆向破解的程序 CrackMe:它们都是一些公开给别人尝试破解的小程序,制作 c ...

  6. 数据库备份 DBS(Database Backup),知识点

    资料 网址 什么是DBS https://help.aliyun.com/document_detail/59133.html?spm=5176.13685554.103.6.3fa463f9CDwW ...

  7. Python input() 函数

    Python3.x 中 input() 函数接受一个标准输入数据,返回为 string 类型. Python2.x 中 input() 相等于 eval(raw_input(prompt)) ,用来获 ...

  8. java读取HDFS压缩文件乱码

    java通过调用HDFS系统的FileSystem等API 直接读取HDFS的压缩文件会产生乱码 解决方法: 1.调用解码的API,解码后通过IO流处理. public static void mai ...

  9. linux command lynx

    [Purpose]        Learning linux command  lynx   [Eevironment]        Ubuntu 16.04 terminal   apt-get ...

  10. django -- ORM查询

    前戏 在我们之前操作ORM中,你也许是启动Django项目,通过地址访问固定的函数,或者在pycharm里的python console里执行,第一种比较麻烦,而且每次都要启动项目,写路由,第二种虽然 ...