Python之路【第七篇】:Python装饰器

阅读目录

一、装饰器

1、装饰器的概念

#装饰器定义:本质就是函数,功能是为其他函数添加附加功能

二、装饰器需要遵循的原则

#原则:
1、不修改被修饰函数的源代码
2、不修改被修饰函数的调用方式

装饰器他人的器具,本事可以是任意可调用对象,被装饰者也可以是任意可调用对象。

#强调装饰器的原则:
1、不修改被装饰对象的源代码
2、不修改被装饰对象的调用方式

#装饰器的目标:
在遵循1和2原则的前提下,为被装饰的对象添加新功能

三、实现装饰器知识储备

装饰器=高阶函数+函数嵌套+闭包

四、高阶函数

高阶函数的定义:
1、函数接收的参数是一个函数名
2、函数的返回值是一个函数名
3、满足上述条件任意一个,都可称之为高阶函数

五、函数嵌套

def father(name):
    print(‘from father %s‘ %name)
    def son():
        print(‘from the son‘)
        def grandson():
            print(‘from the grandson‘)
        grandson()
    son()

father(‘朱锐‘)

六、闭包

1、闭包

def father(name):
    print(‘from father %s‘ %name)
    def son():
        print(‘from the son‘)
        def grandson():
            print(‘from the grandson‘)
        grandson()
    son()

father(‘朱锐‘)

‘‘‘
闭包
‘‘‘

def father(name):
    def son():
        # name=‘simon1‘
        print(‘我的爸爸是%s‘ %name)
        def grandson():
            print(‘我的爷爷是%s‘ %name)
        grandson()
    son()
father(‘simon‘)

2、函数闭包装饰器基本实现

import time
def timmer(func):
    def wrapper():
        # print(func)
        start_time=time.time()
        func() #就是在运行test()
        stop_time=time.time()
        print(‘运行时间是%s‘ %(stop_time-start_time))
    return wrapper
@timmer #语法糖,这个是重点

def test():
    time.sleep(3)
    print(‘test函数运行完毕‘)

# res=timmer(test) #返回的是wrapper的地址
# res() #执行的是wrapper()

# test=timmer(test) #返回的是wrapper的地址
# test() #执行的是wrapper()

test()
‘‘‘
语法糖
‘‘‘
# @timmer #就相当于 test=timmer(test)

3、函数闭包加上返回值

#未加返回值
import time
def timmer(func):
    def wrapper():
        # print(func)
        start_time=time.time()
        func() #就是在运行test()
        stop_time=time.time()
        print(‘运行时间是%s‘ %(stop_time-start_time))
        return 123
    return wrapper
@timmer #语法糖

def test():
    time.sleep(3)
    print(‘test函数运行完毕‘)
    return ‘这是test的返回值‘
res=test() #就是在运行wrapper
print(res)

运行结果如下:
C:\Python35\python3.exe G:/python_s3/day20/加上返回值.py
test函数运行完毕
运行时间是3.000171661376953
123
#加上返回值
import time
def timmer(func):
    def wrapper():
        # print(func)
        start_time=time.time()
        res=func() #就是在运行test()     ##主要修改这里1
        stop_time=time.time()
        print(‘运行时间是%s‘ %(stop_time-start_time))
        return res     ##修改这里2
    return wrapper
@timmer #语法糖

def test():
    time.sleep(3)
    print(‘test函数运行完毕‘)
    return ‘这是test的返回值‘
res=test() #就是在运行wrapper
print(res)

运行结果如下:
C:\Python35\python3.exe G:/python_s3/day20/加上返回值.py
test函数运行完毕
运行时间是3.000171661376953
这是test的返回值

4、函数闭包加上参数

import time
def timmer(func):
    def wrapper(name,age):   #加入参数,name,age
        # print(func)
        start_time=time.time()
        res=func(name,age) ##加入参数,name,age
        stop_time=time.time()
        print(‘运行时间是%s‘ %(stop_time-start_time))
        return res
    return wrapper
@timmer #语法糖

def test(name,age): #加入参数,name,age
    time.sleep(3)
    print(‘test函数运行完毕,名字是【%s】,年龄是【%s】‘ % (name,age))
    return ‘这是test的返回值‘
res=test(‘simon‘,18) #就是在运行wrapper
print(res)

使用可变长参数代码如下:达到的效果是传参灵活

import time
def timmer(func):
    def wrapper(*args,**kwargs): #test(‘simon‘,18)  args=(‘simon‘) kwargs={‘age‘:18}
        # print(func)
        start_time=time.time()
        res=func(*args,**kwargs) #就是在运行test()     func(*(‘simon‘),**{‘age‘:18})
        stop_time=time.time()
        print(‘运行时间是%s‘ %(stop_time-start_time))
        return res
    return wrapper
@timmer #语法糖

def test(name,age):
    time.sleep(3)
    print(‘test函数运行完毕,名字是【%s】,年龄是【%s】‘ % (name,age))
    return ‘这是test的返回值‘
def test1(name,age,gender):
    time.sleep(1)
    print(‘test函数运行完毕,名字是【%s】,年龄是【%s】,性别是【%s】‘ % (name,age,gender))
res=test(‘simon‘,18) #就是在运行wrapper
print(res)

test1(‘simon‘,18,‘male‘)

原文地址:https://www.cnblogs.com/hackerer/p/10727349.html

时间: 2024-08-30 14:19:46

Python之路【第七篇】:Python装饰器的相关文章

流畅的python学习笔记第七章:装饰器

装饰器就如名字一样,对某样事物进行装饰过后然后返回一个新的事物.就好比一个毛坯房,经过装修后,变成了精装房,但是房子还是同样的房子,但是模样变了. 我们首先来看一个函数.加入我要求出函数的运行时间.一般来说代码写成如下.但是我有很多个函数都要计算运行时间.每个函数里面都要写一个计时的过程是一件很麻烦的事. def target():     start=time.time()     print 'running target()'     end=time.time()     print e

python之路 内置函数,装饰器

一.内置函数 #绝对值 abs() #所有值都为真才为真 all() #只要有一个值为真就为真 any() #10进制转成二进制 bin() #10进制转成八进制 oct() #10进制转成十六进制 hex() #布尔值 bool() #字符转换成字节 bytes() #字节转换成字符 str() #对文件的操作 open() #基本流程 #打开文件 op_file=open("file name","rwb+") #操作文件 op_file.operation()

NO.4:自学python之路------内置方法、装饰器、迭代器

引言 是时候开始新的Python学习了,最近要靠英语,可能不会周更,但是尽量吧. 正文 内置方法 Python提供给了使用者很多内置方法,可以便于编程使用.这里就来挑选其中大部分的内置方法进行解释其用途. abs() #求取绝对值,例子. a = -5 abs(a)#求绝对值 all() #迭代对象全为真,则返回Ture,否则返回False,例子. all([1,5,6])#True all([5,0,6])#False any() #与all类似,但是有真则返回Ture,全假返回False,例

python之路_函数实例及装饰器介绍

一.习题讲解 1.写函数,返回一个扑克牌列表,里面有52项,每一项是一个元组.例如:[('红心',2), ('草花',2), -('黑桃,'A')] def cards(): num=[] for v in range(2,11): num.append(v) num.extend(['J','Q','K','A']) type=['红心','草花','方块','黑桃'] result=[] for i in num: for j in type: result.append((j,i)) re

Python之路【第二篇】:Python基础(一)

Python之路[第二篇]:Python基础(一) 入门知识拾遗 一.作用域 对于变量的作用域,执行声明并在内存中存在,该变量就可以在下面的代码中使用. 1 2 3 if 1==1:     name = 'wupeiqi' print  name 下面的结论对吗? 外层变量,可以被内层变量使用 内层变量,无法被外层变量使用 二.三元运算 1 result = 值1 if 条件 else 值2 如果条件为真:result = 值1如果条件为假:result = 值2 三.进制 二进制,01 八进

Python之路【第九篇】:Python操作 RabbitMQ、Redis、Memcache、SQLAlchemy

Python之路[第九篇]:Python操作 RabbitMQ.Redis.Memcache.SQLAlchemy Memcached Memcached 是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提高动态.数据库驱动网站的速度.Memcached基于一个存储键/值对的hashmap.其守护进程(daemon )是用C写的,但是客户端可以用任何语言来编写,并通过memcached协议与守护进程通信. Memc

Python之路【第九篇】:Python基础(26)——socket server

socketserver Python之路[第九篇]:Python基础(25)socket模块是单进程的,只能接受一个客户端的连接和请求,只有当该客户端断开的之后才能再接受来自其他客户端的连接和请求.当然我 们也可以通过python的多线程等模块自己写一个可以同时接收多个客户端连接和请求的socket.但是这完全没有必要,因为python标准库已经为 我们内置了一个多线程的socket模块socketserver,我们直接调用就可以了,完全没有必要重复造轮子. 我们只需简单改造一下之前的sock

13、python中的函数(闭包与装饰器)

一.嵌套函数 函数的内部又再定义另一个函数,这个函数就叫嵌套函数,里面含函数就叫内部函数. 示例: 二.返回函数 函数可以接收函数对象作为参数,同理函数也能返回一个函数对象作为返回值. 示例: 返回函数可以用来延迟函数的执行. 三.命名空间与变量作用域 变量作用域指的是变量的存活的范围.命名空间指的是属于一个对象的所有属性(对象)的集合. 示例: A的命名空间是A函数对象里面的所有对象的集合,包括变量a.函数B.变量b:B的命名空间就是属于函数B的所有对象的集合,包括变量b: a的变量作用域就是

python 类中的某个函数作为装饰器

在python的类中,制作一个装饰器的函数, class A: def wrapper(func): ###装饰器 def wrapped(self,*arg,**kwargs) ... return wrapped @ wrapper ###装饰mix def mix(): ... 当调用mix的时候,self.mix() ,会将self等参数传入 wrapper 中来吗?答案为否. 当wrapper作为装饰器的并且@wrapper这种方式作为装饰的时候,wrapper就跟普通的函数一样,仅仅

Python之路番外:PYTHON基本数据类型和小知识点

Python之路番外:PYTHON基本数据类型和小知识点 一.基础小知识点 1.如果一行代码过长,可以用续行符 \换行书写 例子 if (signal == "red") and (car == "moving"): car = "stop" else : pass 等同于 if (signal == "red") and (car == "moving"): car = "stop"