Python 教程

Python 教程 Python 简介 Python 历史 Python 下载安装和环境配置 Python 入门 Python 语法 Python 输出 Python 注释 Python 变量 Python 数据类型 Python 数值类型 Python 类型转换 Python 字符串 Python 布尔值 Python 运算符 Python 列表 Python 元组 Python 集合 Python 字典 Python If...Else Python While 循环 Python For 循环 Python 函数 Python Range Python 数组 Python 类和对象 Python 继承 Python 迭代 Python 模块 Python 日期时间 Python 数学运算 Python JSON Python 正则表达式 Python PIP Python Try...Except Python 用户输入 Python 字符串格式化

Python 文件处理

Python 文件处理 Python 打开文件 Python 创建/写入文件 Python 删除文件

Python NumPy

NumPy 简介 NumPy 入门 NumPy 创建数组 NumPy 数组索引 NumPy 数组裁切 NumPy 数据类型 NumPy 副本 vs 视图 NumPy 数组形状 NumPy 数组重塑 NumPy 数组迭代 NumPy 数组连接 NumPy 数组拆分 NumPy 数组搜索 NumPy 数组排序 NumPy 数组过滤 NumPy 随机数 NumPy ufunc 通用函数

Python SciPy

SciPy 简介 SciPy 入门 SciPy 常量 SciPy 优化器 SciPy 稀疏数据 SciPy 图表 SciPy 空间数据 SciPy Matlab 数组 SciPy 插值 SciPy 统计显着性检验

Python 机器学习

Machine 机器学习入门 Machine 平均中位数模式 Machine 标准差 Machine 百分位数 Machine 数据分布 Machine 正态数据分布 Machine 散点图 Machine 线性回归 Machine 多项式回归 Machine 多元回归 Machine 缩放 Machine 训练/测试 Machine 决策树

Python MySQL

MySQL 入门 MySQL Create Database MySQL Create Table MySQL Insert MySQL Select MySQL Where MySQL Order By MySQL Delete MySQL Drop Table MySQL Update MySQL Limit MySQL Join

Python MongoDB

MongoDB 入门 MongoDB 创建数据库 MongoDB 创建集合 MongoDB 插入 MongoDB 查找 MongoDB 查询 MongoDB 排序 MongoDB 删除 MongoDB 删除集合 MongoDB 更新 MongoDB 限制

Python 参考手册

Python 参考手册 Python 内置函数 Python 字符串方法 Python 列表/数组方法 Python 字典方法 Python 元组方法 Python 集合方法 Python 文件方法 Python 关键字 Python 内置异常 Python 词汇表

Python 模块参考

Python 内置模块 Python random 随机模块 Python requests 请求模块 Python statistics 统计模块 Python math 数学模块 Python cMath 模块

Python 如何使用

Python 删除列表重复项 Python 反转字符串 Python 添加两个数字

Python 高级教程

Python 常用指引 将Python2代码迁移到Python3 将扩展模块移植到 Python3 Curses 编程 描述器使用指南 函数式编程指引 日志常用指引 日志操作手册 正则表达式使用指南 套接字编程指南 排序指南 Unicode 指南 如何利用urllib包获取网络资源 Argparse 教程 ipaddress 模块介绍 Argument Clinic 的用法 使用DTrace和SystemTap检测CPython 对象注解属性的最佳实践

Python 实例

Python 实例 Python 编译器 Python 练习 Python 测验 NumPy 测验 SciPy 测验


Python 装饰器

装饰器允许你为函数添加额外的行为,而无需更改函数的代码。

装饰器是一个函数,它接受另一个函数作为输入,并返回一个新函数。


Basic Decorator

先定义装饰器,然后在函数上方使用 @decorator_name 应用它。

实例

一个基本的装饰器,用于将装饰函数的返回值转换为大写。

def changecase(func):
  def myinner():
    return func().upper()
  return myinner

@changecase
def myfunction():
  return "Hello Sally"

print(myfunction())
亲自试一试 »

通过将 @changecase 直接放在函数定义上方,函数 myfunction 就被 changecase 函数"装饰"了。

函数 changecase 是装饰器。

函数 myfunction 是被装饰的函数。


多次调用装饰器

装饰器可以多次调用。只需将装饰器放在要装饰的函数上方即可。

实例

在两个函数上使用 @changecase 装饰器:

def changecase(func):
  def myinner():
    return func().upper()
  return myinner

@changecase
def myfunction():
  return "Hello Sally"

@changecase
def otherfunction():
  return "I am speed!"

print(myfunction())
print(otherfunction())
亲自试一试 »

装饰函数中的参数

需要参数的函数也可以被装饰,只需确保将参数传递给包装函数即可:

实例

带参数的函数也可以被装饰:

def changecase(func):
  def myinner(x):
    return func(x).upper()
  return myinner

@changecase
def myfunction(nam):
  return "Hello " + nam

print(myfunction("John"))
亲自试一试 »

*args 和 **kwargs

有时装饰器函数无法控制被装饰函数传递的参数。为了解决这个问题,可以在包装函数中添加 (*args, **kwargs),这样包装函数就可以接受任意数量和任意类型的参数,并将它们传递给被装饰函数。

实例

使用 *args 和 **kwargs 参数保护函数:

def changecase(func):
  def myinner(*args, **kwargs):
    return func(*args, **kwargs).upper()
  return myinner

@changecase
def myfunction(nam):
  return "Hello " + nam

print(myfunction("John"))
亲自试一试 »

带参数的装饰器

装饰器可以通过添加额外的包装层来接受自己的参数。

实例

一个装饰器工厂,它接受一个参数并根据参数值转换大小写。

def changecase(n):
  def changecase(func):
    def myinner():
      if n == 1:
        a = func().lower()
      else:
        a = func().upper()
      return a
    return myinner
  return changecase

@changecase(1)
def myfunction():
  return "Hello Linus"

print(myfunction())
亲自试一试 »

多个装饰器

你可以在一个函数上使用多个装饰器。

这可以通过将装饰器调用顺序依次排列来实现。

装饰器会按照指定的顺序调用。

示例

一个装饰器用于将所有内容转换为大写,另一个用于添加问候语:

def changecase(func):
  def myinner():
    return func().upper()
  return myinner

def addgreeting(func):
  def myinner():
    return "Hello " + func() + " Have a good day!"
  return myinner

@changecase
@addgreeting
def myfunction():
  return "Tobias"

print(myfunction())
亲自试一试 »

保留函数元数据

Python 中的函数具有元数据,可以使用 __name__ 和 __doc__ 属性访问这些元数据。

实例

通常,函数名称可以通过 __name__ 属性返回:

def myfunction():
  return "Have a great day!"

print(myfunction.__name__)
亲自试一试 »

但是,当一个函数被装饰器修饰时,原始函数的元数据就会丢失。

实例

尝试从装饰器修饰的函数中返回名称,你会发现结果不一样:

def changecase(func):
  def myinner():
    return func().upper()
  return myinner

@changecase
def myfunction():
  return "Have a great day!"

print(myfunction.__name__)
亲自试一试 »

为了解决这个问题,Python 提供了一个名为 functools.wraps 的内置函数,可以用来保留原始函数的名称和文档字符串。

实例

导入 functools.wraps 以保留原始函数名和文档字符串。

import functools

def changecase(func):
  @functools.wraps(func)
  def myinner():
    return func().upper()
  return myinner

@changecase
def myfunction():
  return "Have a great day!"

print(myfunction.__name__)
亲自试一试 »