测开之函数进阶篇・第七篇《装饰器》(代码片段)

七月的小尾巴 七月的小尾巴     2022-12-27     448

关键词:

装饰器

开放封闭原则

软件实体应该是可扩展、而不可修改的。也就是说,对扩展是开放的,而对修改是封闭的。

装饰器的作用

在不更改原功能函数内部代码,并且不改变调用方法的情况下为原函数添加新的功能。

装饰器的应用场景

  1. 登录验证
  2. 函数运行时间统计
  3. 执行函数之前做准备工作
  4. 执行函数后的清理工作

实现一个装饰器

”“”
需求:在访问网站前,我们需要判断用户登录
在不更改原功能的基础上,新增新的功能
“”“
def login(func):

    def fun():
	    username = "python"
		password = '123456'
        user = input("请输入账号:")
        pwd = input("请输入密码:")

        if username == user and pwd == password:
            func()

        else:
            print("账号或者密码错误")

    return fun


@login
def index():
    print('这个是网站的首页')


index()

装饰器原理阐述

将装饰的函数当做一个参数传到装饰器中,并且让被装饰的函数名执行装饰器内部的函数,在装饰器内部函数中用接收到的参数在调用被装饰的函数。

带参数的装饰器

def login(func):
    def fun(*args, **kwargs):
        print("装饰器功能代码:登录")
        func(*args, **kwargs)

    return fun


@login
def index():
    print("这个是网站首页")

@login
def good_list(num):
    print("这里是网站列表第页".format(num))


index()
good_list(10)

装饰器装饰类

首先,我们在装饰类之前,我们先定义一个普通的类,并且打印这个类信息,先来查看一下。


class MyClass:
    def __init__(self):
        pass


m = MyClass()
print(m)

返回:<__main__.MyClass instance at 0x109137560>

我们可以看到该类的内存地址。那么下面我们定一个装饰器装饰类,我们依旧用之前的login装饰器。我们来看一下打印信息。

def login(func):
    def fun(*args, **kwargs):
        print("装饰器功能代码:登录")
        func(*args, **kwargs)

    return fun


@login
class MyClass:
    def __init__(self):
        pass


m = MyClass()
print(m)

返回:None

装饰器装饰类的时候,和装饰函数的时候有所不同。从上方代码中,我们可以看到,由原先的对象信息变成返回None了。那么是什么原理呢?

首先,我们在使用 @login 装饰器时,相当于执行了 Myclass = login(MyClass),那么原先装饰器是针对函数使用的,现在我们将类给传过去的时候,相当于直接执行了 fun() 的函数,但是我们可以看到, fun() 函数内部中并没有 rentun ,因此返回了None,此时我们在函数中加上return。

def login(func):
    def fun(*args, **kwargs):
        print("装饰器功能代码:登录")
        return func(*args, **kwargs)
        

    return fun


@login
class MyClass:
    def __init__(self):
        pass


m = MyClass()
print(m)

返回:<__main__.MyClass instance at 0x10be32560>

因此,在装饰类的时候,必须加上return,如果是装饰函数的话,不一定需要加上return。

定义一个时间装饰器

import time


def wapper(func):

    def count_time(*args, **kwargs):

        start_time = time.time()
        func(*args, **kwargs)

        end_time = time.time()
        print("函数运行的时间为::.5f".format(end_time - start_time))

    return count_time()

测开之函数进阶篇・第五篇《递归函数纯函数匿名函数偏函数》(代码片段)

目录递归函数递归函数的定义定义递归函数纯函数纯函数的概念纯函数的3个原则函数的副作用python常用的内置函数匿名函数三步运算符偏函数偏函数的定义偏函数的案例递归函数递归函数的定义在函数中调用函数自身,我们... 查看详情

测开之数据类型进阶篇・第四篇《生成器和迭代器》(代码片段)

这里写目录标题生成器表达式生成器的定义为什么要有生成器创建生成器生成器的工作原理迭代器可迭代对象迭代器对象工作原理迭代器的优缺点生成器表达式生成器的定义在Python中,一边循环一边计算的机制,称为生... 查看详情

测开之面向对象进阶篇・《多态》(代码片段)

面向对象三大特征面向对象编辑的三大特征:封装、继承、多态。封装:客观的失误封装成类(将数据和方法放在一个类中构成了封装)。继承:python中一个类可以继承于一个类,也可以继承多个类,... 查看详情

测开之数据类型进阶篇・第三篇《推导式》(代码片段)

目录列表推导式什么是推导式?推导式代码实现推导式的误区在列表推导式中添加if语句列表推导式中实现多个循环字典推导式字典推导式实现列表推导式什么是推导式?列表推导式可以利用range区间、元组、列表、字典... 查看详情

测开之面向对象进阶篇・《属性自省》(代码片段)

私有属性类里面定义的变量叫做属性,那么类属性有两种,分为:公有属性和私有属性。私有属性的定义:单下滑线开头:_attr双下划线开头:__attr其中单下划线开头的在外部可以直接访问,双下滑线&#... 查看详情

测开之面向对象进阶篇・《魔术方法》(代码片段)

魔术方法在类方法中__init__方法有什么作用?创建对象时,自动调用对创建的对象进行初始化设置。什么是魔术方法?在python中,像__init__这类双下滑线开头和结尾的方法,统一称之为魔术方法。注意:在... 查看详情

测开之数据类型进阶篇・第二篇《字典和集合的原理应用》(代码片段)

目录集合什么是集合?定义空集合集合的特点-自动去重集合常用的方法空集合添加元素add()删除集合元素remove()更新元素update()清空集合元素clear()复制元素copy()字典和集合的存储原理关于集合、字典、元祖、列表性能分析集... 查看详情

测开之并发编程篇・《并发并行线程队列进程和协程》(代码片段)

并发编程并发和并行多任务概念并发和并行同步和异步多线程threading模块介绍自定义线程类线程任务函数的传递多线程资源共享和资源竞争问题GIL全局解释锁互斥锁通过锁解决资源竞争问题死锁队列队列的方法FIFO先入先出队列LI... 查看详情

测开之css・第一篇《css语法基础》(代码片段)

目录css介绍和引用css概述css的基础语法css引入方法css背景设置背景色设置背景图像背景定位css文本样式css选择器标签选择器id选择器类选择器属性选择器包含选择器(层级选择器)组选择器css介绍和引用css概述CSS指的是层... 查看详情

flask初识,第七篇,flask中的路由(代码片段)

 Flask中的路由系统其实我们并不陌生了,从一开始到现在都一直在应用@app.route("/",methods=["GET","POST"])为什么要这么用?其中的工作原理我们知道多少?请关注跟DragonFire学Flask之路由系统,这里有你想要的答案 1.@app.route()装饰器... 查看详情

第七篇:面向对象高级

第七篇:面向对象高级   PYTHON-绑定方法反射内置函数PYTHON-组合封装多态property装饰器 查看详情

函数进阶(装饰器)(代码片段)

装饰器python装饰器本质上就是一个函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外的功能,装饰器的返回值也是一个函数对象(函数的指针)。装饰器函数的外部函数传入我要装饰的函数名字,返回经过修饰... 查看详情

测开之javascript・《javascript基础》(代码片段)

Javascript介绍和基本使用Javascript概述嵌入页面的方式基本用法注释变量数据类型运算符条件语句函数对象循环扩展介绍和基本使用Javascript概述要了解JavaScript,我们首先要回顾一下JavaScript的诞生。在上个世纪的1995年,当... 查看详情

进阶python:装饰器全面详解(代码片段)

...,使得代码更具有Python简洁的风格。换句话说,它是一种函数的函数,因为装饰器传入的参数就是一个函数,然后通过实现各种功能来对这个函数的功能进行增强。为什么用装饰器?前面提到了,装饰器是通过某种方式来增强函... 查看详情

kubernetes第七篇:pod进阶controller进阶resource和dashboard(代码片段)

文章目录一、前言二、Pod进阶学习之路2.1Pod的生命周期Lifecycle2.2Pod的重启策略RestartPolicy2.3静态Pod2.4Pod的健康检查2.5ConfigMap2.5.1ConfigMap的创建创建方式1:命令行创建configmap创建方式2:根据配置文件中创建configmap创建方式3&#... 查看详情

python进阶装饰器(decorator)(代码片段)

...4.小结装饰器的使用1.装饰器的使用场景2.装饰器实现已有函数执行时间的统计2.小结通用装饰器的使用1.装饰带有参数的函数2.装饰带有返回值的函数3.装饰带有不定长参数的函数多个装饰器的使用1.多个装饰器的使用示例代码带... 查看详情

装饰器进阶(代码片段)

...回值,有一个参数,万能参数装饰器的作用----不想修改函数的调用方式,但是还想再原来的函数前后添加功能装饰器的原则-----开放封闭式原则:开放--对外是开放的  封闭---对修改的是封闭的1)最简单的装饰器importtime--... 查看详情

十装饰器进阶(代码片段)

执行函数的时候*打散定义函数的时候*聚合fromfunctoolsimportwrapsdefwrapper(f):#f=func1@wraps(f)definner(*args,**kwargs):#聚合#args(1,2,3)‘‘‘执行函数之前的相关操作‘‘‘ret=f(*args,**kwargs)#打散1,2,3‘‘‘执行函数之后的相关操作‘‘‘return... 查看详情