IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> Python知识库 -> python-装饰器 -> 正文阅读

[Python知识库]python-装饰器

什么是装饰器

从字面意思上来看,装饰器是用来装饰其他东西的工具。在python中装饰器分为函数装饰器和类装饰器。
简而言之,函数装饰器是用来装饰函数的装饰器,其主要目的是增加目标函数的功能,类装饰器也就是装饰类的装饰器,增加类的功能。

函数装饰器

装饰器本质是嵌套函数
下面是一个简单的装饰器

# fun1为装饰器名称,function指的是被装饰的函数
def fun1(function):
	def fun2():
		print("开始了!")
		function() # 执行被装饰的函数或者 或者 return function()
	return fun2

外面的fun1()需要传入一个参数,这个参数是用来传入要被装饰的函数,里面的fun2()需要执行function这个参数。
这是将函数当成参数传入另一个函数。

使用方法
在需要装饰的函数上添加@装饰器名称

@fun1
def fun3():
	print("aaa")

fun3()

可以等价成这样:

def fun3():
	print("aaa")
fun = fun1(fun3)
fun()

输出结果是一致的

执行结果

开始了!
aaa

如果传入的函数需要参数可以这样写:

def fun1(function):
	def fun2(a):
		print("开始了!")
		function(a) 
	return fun2

@fun1
def fun3(a):
	print(a)
fun3("aaa")

输出结果:

开始了!
aaa

如果不清楚传入的函数需要多少个参数,可以这样写:

def fun1(function):
	def fun2(*args, **kwargs):
		print("开始了!")
		function(*args, **kwargs) 
	return fun2

@fun1
def fun3(a,b):
	print(a,b)

@fun1	
def fun4(a,b,c):
    print(a,b,c)
    
fun3("aaa","bbb")
fun4("ccc","ddd","eee")

运行结果

开始了!
aaa bbb
开始了!
ccc ddd eee

如果函数装饰器需要添加参数,可以这样写:

def fun(msg):
	def fun1(function):
		def fun2(*args, **kwargs):
			print("开始了!{}".format(msg))
			function(*args, **kwargs) 
		return fun2
	return fun1

@fun(msg="小朋友")
def fun3(a,b):
	print(a,b)

fun3("aaa","bbb")

运行结果:

开始了!小朋友
aaa bbb

类装饰器

类装饰器的用法基本和函数装饰器一样,只不过是用类写的装饰器

class fun1(object):
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        print(("开始了!")
        self.func(*args, **kwargs)

@fun1
def fun2(a,b):
	print(a,b)

fun2("aaa","bbb")

类装饰用到了类的__call__方法

运行结果

开始了!
aaa bbb

还可以这样写:

class fun(object):
    def __init__(self, msg):
        self.msg = msg
        

    def __call__(self, func):
        def fun1(*args, **kwargs):
            print("开始了!{0}".format(self.msg))
            func(*args, **kwargs)
        return fun1

@fun(msg="小朋友")
def fun2(a, b):
    print(a, b)

fun2("aaa,","bbb")

运行结果:

开始了!小朋友
aaa, bbb
  Python知识库 最新文章
Python中String模块
【Python】 14-CVS文件操作
python的panda库读写文件
使用Nordic的nrf52840实现蓝牙DFU过程
【Python学习记录】numpy数组用法整理
Python学习笔记
python字符串和列表
python如何从txt文件中解析出有效的数据
Python编程从入门到实践自学/3.1-3.2
python变量
上一篇文章      下一篇文章      查看所有文章
加:2021-10-29 12:58:42  更:2021-10-29 13:02:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 22:20:42-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码