Python_day_06_装饰器

u3d逆向学习之纯C内存读写与ImGui绘制(Android) 方法:需要在/proc/pid/maps文件查找模块名,一行行遍历所有内存,第一个参数为模块名,第二个参数为索引index(因为该模块会有多个,index为正序遍历第index个该模块),若找到了则使用。32位游戏的指针大小采用4字节,而64位游戏的指针大小采用8字节(这里需要注意),数据地址以16进制存储,使用unsigned long类型 ,该函数只有一个参数,数据地址,返回该地址的指针跳转地址。文件,比较其中的内容是否与传入的包名相同,如果相同,则返回该进程的PID。 阅读详情

装饰器: 器,函数;实质上是用来装饰函数的函数
产品经理和开发人员

1. 定义万能装饰器

def 装饰器名称(f):
    def wrapper(*args, **kwargs):
        # 函数执行之前的操作
        f(*args, **kwargs)
        # 函数执行之后的操作
    return wrapper

def 装饰器名称(f):
    def wrapper(*args, **kwargs):
        if 条件:
            f(*args, **kwargs)
        else:
            # 报错并抛出异常 raise Error("xxxxxx")
    return wrapper

2. 有参数的装饰器

def 有参数的装饰器(*args, **kwargs):
    def 装饰器名称(f):
        def wrapper(*args, **kwargs):
            if 条件:
                f(*args, **kwargs)
            else:
                # 报错并抛出异常 raise Error("xxxxxx")
        return wrapper
    return 装饰器名称

3. 装饰器底层原理

@timmer         # fun = timmer(fun)
def fun():
    pass

4. functools: 保留原有函数的名称(f.name)和文档帮助等信息;

def 装饰器名称(f):
    @functools.wrap(f)
    def wrapper(*args, **kwargs):
        if 条件:
            f(*args, **kwargs)
        else:
            # 报错并抛出异常 raise Error("xxxxxx")
    return wrapper

5. inspect:

    不管是默认参数, 必选参数, 可变参数, 关键子参数, 都会将形式参数和传的值封装为字典;便于使用;

"""

**例子1:
# 装饰器: 本质上是一个函数, 接收其他函数作为参数;对于原有的函数做了新的修改;
import random
import time


def addInfo(fun):   # fun: transferMoney
    def wrapper():
        print "六一儿童节快乐...."
        fun()   # transferMoney()
        print fun.__name__
        print "欢迎使用ICBC ATM......."
    return  wrapper

# python的语法糖:for i in s:
@addInfo
#     transferMoney = addInfo(transferMoney)  # 返回wrapper
def transferMoney():
    print "转账......."
# wrapper

transferMoney()

**例子2:
计时器
import random
import time
import functools

def timmer(fun):        # fun = login
    # 这个@functools.wraps(fun)可以保留函数原有的函数名和函数帮助文档;
    @functools.wraps(fun)
    def wrapper(*args, **kwargs):
        """this is wrapper"""
        # args: tuple
        # kwargs: dict
        # 获取当前时间戳i
        start_time = time.time()
        # *args对元组进行解包;
        # **kwargs对字典进行解包的;
        fun(*args, **kwargs)           # fun()   ==== login()
        end_time = time.time()
        # 任何一个函数都有一个属性__name__,获取函数名称;
        print "%s 执行时间为%s" %(fun.__name__, end_time-start_time)
    return wrapper

@timmer
def fun1():
    print "func1....."
    # time.sleep: 休眠
    # random.random: 随即生成一个0~1之间的数;
    time.sleep(random.random())

@timmer
# login = timmer(login)
def login(name, password):
    """ user login
    """
    if name == 'root' and password == 'redhat':
        print 'login ok'
    else:
        print 'login fail'

if __name__ == "__main__":
    login('root', 'westos')
    print login.__name__
    print login.func_doc

**例子3:
多个装饰器
def makebold(fn):
    def wrapper():
        return "<b>" + fn() + '</b>'
    return wrapper

def makeitalic(fn):
    def wrapper():
        return "<i>" + fn() + "</i>"
    return wrapper

@makebold  # <b>"hello world"</b>
@makeitalic #  <i><b>"hello world"</b></i>
def hello():
    return "hello world"

if __name__ == "__main__":
    print hello()

**例子4:
def counter(f):
    def wrapper(*args, **kw):
        wrapper.count += 1
        f(*args, **kw)
        print "%s has been used %s" %(f.__name__,wrapper.count)

    wrapper.count = 0
    return  wrapper

@counter
def fun():
    print "fun......."

@counter
def fun1():
    print "fun1......."
f1 = fun()
f2 = fun()
f3 = fun()
f4 = fun()
f5 = fun()

**例子5:
给装饰器传参
import random
import time

def add(name):      # name = "转账
    def addInfo(fun):   # fun: transferMoney
        def wrapper():
            print "六一儿童节快乐...."
            fun()   # transferMoney()
            print fun.__name__
            print "欢迎使用ICBC ATM...%s模块...." %(name)
        return  wrapper
    return addInfo

@add("转账")   # add = add("转账")
def transferMoney():
    print "欢迎来到ATM....."

@add("存钱")   # add = add("转账")
def saveMoney():
    print "欢迎来到ATM....."

transferMoney()
saveMoney()

**例子6:
import functools

def required_type(*args_type):
    # args_type: tuple
    def required_num(f):
        @functools.wraps(f)
        def wrapper(*args, **kwargs):
            # args:tuple
            # kwargs:
            # kwargs.values(): list
            for arg in args + tuple(kwargs.values()):
                print args_type
                if not isinstance(arg, args_type):
                    # 抛出异常
                    # f.__name__函数的名称
                    raise TypeError("[参数错误]: %s only accept nums as arguments;" % (f.__name__))
            #f: 是函数名, f():调用函数
            return f(*args, **kwargs)

        return wrapper
    return required_num

@required_type(int, float)
def add(a, b):
    return a + b

print  add(5, 1.0)
【实战教程】OpenClaw接入MySQL数据库实战指南 本文介绍了在虚拟机Ubuntu中访问宿主机Win11中MySQL数据库的配置方法,重点包括创建远程用户、权限配置和安全设置。首先在MySQL中创建具有只读权限的用户并刷新权限,然后调整服务器设置允许远程连接。文章还提供了某金融机构财富管理系统的数据库设计方案,包含理财产品表、客户表和份额表的核心结构,其中金额字段使用DECIMAL类型确保精度,并设置唯一键约束。文末强调测试环境配置完成后应恢复安全更新模式以保障生产环境安全。 阅读详情

相关推荐

ArcGIS学习记录—SHP文件转换为KML KMZ数据,并显示面要素相应的标注

使用相应软件操作获取KMZ数据得以下发到外业调查人员,使得矢量数据能够更显而易见,可视化,让外业人员的工作减轻许多。(过程步骤是借鉴于网络上的相关人士给的建议,根据这些建议自己做出来的步骤,可能有些粗略,有问题的话可以再进行探讨)...

qq_41046162的博客 5万+

Python学习day06 装饰器

装饰器器就是函数装饰器就是用来装饰函数的函数 匿名函数 面向对象编程 什么是面向对象 面向对象的三个特性封装继承多态装饰器(器,就是函数,装饰器就是用来装饰函数的函数)普通的函数: def 函数名(形参): # 变量名 函数体 return 变量|常量print 函数名(实参) 匿名函数lambda 形参 : 返回值面向对象编程面向过程:

happypant的博客 292

避坑指南:海康MV_CC_SetIntValue接口的7个典型报错解决方案

本文深度解析海康工业相机SDK中MV_CC_SetIntValue接口的典型报错,提供7个实战解决方案。针对MV_E_CALLORDER、MV_E_PARAMETER等高频错误码,从设备状态、参数值域、依赖关系等核心约束入手,给出清晰的诊断流程与根治代码,帮助开发者构建健壮的参数设置模块,提升开发效率。

y2z3a4b5c的博客 1080

Python入门--day06--递归函数及装饰器函数

本文介绍了Python中的递归函数与装饰器函数。递归函数通过将问题分解为子问题来求解,需要设置终止条件以防止无限循环,并以阶乘和斐波那契数列为例进行了说明。装饰器函数基于闭包思想,用于增强函数功能,分为基本装饰器、带参数装饰器和装饰器链三种形式,通过实例展示了日志记录、函数重复执行等功能。文章强调这两个概念需要深入理解,虽然装饰器在日常编码中较少自行编写,但在使用第三方库时能提升代码效率与可读性。

2303_78278237的博客 1360

tmux + Claude Code 远程开发指南:从 WSL 配置到断线无忧

远程开发中,SSH 连接中断常导致后台任务丢失,这是困扰开发者的经典难题。tmux 作为终端复用器,通过将进程挂在常驻会话中,使其脱离 SSH 连接独立运行,从根本上解决了断线导致的任务终止问题。Claude Code 等 AI 编程代理需要长时间运行并保持交互上下文,恰好依赖这种会话持久化能力。结合 Windows Subsystem for Linux 提供类 Unix 环境,开发者可在 Windows 上实现稳定的远程开发工作流。本文将完整介绍从 WSL 环境配置、tmux 会话管理,到与 Claud

weixin_30423065的博客 348

告别数据丢失焦虑:用Python手把手实现Reed-Solomon码(附完整代码)

本文详细介绍了如何使用Python实现Reed-Solomon纠错码(RS码),帮助开发者有效防止数据丢失。通过基础编解码实战、文件保护方案和高级性能优化技巧,读者可以轻松掌握这一前向纠错技术,应用于物联网、文件存储和网络传输等场景,提升数据可靠性。

weixin_42527160的博客 224

从zer0开始学Python|Day 06:Python 高阶技巧,深入理解递归函数与装饰器函数

本文介绍了Python中递归函数和装饰器函数两个核心概念。递归函数通过自调用解决重复子问题,包括阶乘、斐波那契数列等经典案例,具有代码简洁但效率较低的优缺点。装饰器函数则用于在不修改源码的情况下增强功能,包括基础装饰器、带参数装饰器、装饰器链等实现方式,适用于日志记录、权限验证等场景。文章通过丰富示例展示了这两种高阶函数的应用要点,并强调理解装饰器链执行顺序的重要性,为掌握Python函数式编程提供了实用指导。

bxbc2391901156的博客 578

基于POI-TL实现动态Word模板数据填充(含图表):从需求到落地的完整开发实践

本文聚焦企业级报告生成场景中 “在线编辑模板 + 动态数据填充” 的核心需求,详细阐述基于 POI-TL、OnlyOffice 与 MinIO 的全栈实现方案。通过代码示例拆解模板加载、文字填充、图表匹配渲染(含通过关系 ID 关联图表与段落的关键逻辑)、报告存储全步骤。最终通过技术组合实现业务人员可视化编辑模板、后端高效填充数据的目标,为同类动态 Word 生成需求提供可复用的实践参考。

imHanweihu的博客 1866

Python学习之Day06学习(迭代器,生成器,装饰器,标准库)

本文介绍了Python中的迭代器、生成器、装饰器和标准库的使用方法。迭代器通过iter()和next()实现元素遍历,生成器通过yield语句减少内存消耗。装饰器使用闭包形式增强函数功能,支持参数传递。标准库部分重点讲解了collections模块中的defaultdict、Counter、OrderedDict和deque等容器类型,以及itertools模块的迭代工具。文章通过具体示例展示了这些特性的实际应用场景和操作方法,如实现迭代器遍历、生成器函数、装饰器语法、字典统计和回文判断等。这些Python

2401_83150173的博客 273

Docker拉取ubuntu22.04镜像使用ROS2 humble及仿真工具可视化进行导航

Docker中安装Ubun22以及ROS,gazebo可视化等

lovebc的博客 1678

华为od统一考试B卷【单词搜索】C++ 实现

找到它是一个小游戏,你需要在一个矩阵中找到给定的单词。假设给定单词 HELLOWORD,在矩阵中只要能找到 H->E->L->L->O->W->O->R->L->D连成的单词,就算通过。意区分英文字母大小写,并且您只能上下左右行走,不能走回头路。

MISAYAONE的博客 712

60天python训练营打卡day29

作业:复习类和函数的知识点,写下自己过去29天的学习心得,如对函数和类的理解,对python这门工具的理解等,未来再过几个专题部分我们即将开启深度学习部分。2.装饰器思想的进一步理解:外部修改、动态。3.类方法的定义:内部定义和外部定义。DAY 29 复习日:类的装饰器。

extan的博客 194

AE-扭曲-变形-弧

一些AE效果的着色器实现记录

What_can_you_do的博客 1175

又开始的python-day06-20200723-闭包-装饰器-模块-os-sys-math-random-datetime-time-calendar-hashlib-hmac

# 1.把一个函数当成另一个函数的返回值 # 2.把一个函数当成另一个函数的参数 # 3.在函数内部定义一个函数 函数的嵌套 外部无法引用函数内部的函数 # 闭包 # 由函数以及相关的引用变量环境组合而成的实体 # 闭包=函数块+引用环境 def outer(): x = 10 def inner(): y = x + 1 return y return inner print(outer()()) # 计算一串代码运行的时间 import tim

心无念的博客 293

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

day17:一文弄懂“无参装饰器”、“有参装饰器”和“叠加装饰器”

装饰:指的是为其他事物添加额外的东西点缀器:指的是工具,可以定义成成函数合到一起的解释:装饰器指的定义一个函数,该函数是用来为其他函数添加额外的功能# 1、调用原函数# 2、为其增加新功能return res举例说明:列举不调用装饰器和调用装饰器时函数index的属性区别,通过案例1和案例2引出进一步被装饰对象在被装饰器调用前和调用后的区别,从而优化下装饰器代码,最终目的是将wrapper函数做的和原函数一模一样。''' 案例1 没有调用装饰器,查看原函数的函数名和功能说明 '''

weixin_46375313的博客 1365

Outlook Express 6 (OE6) for Win7/Win8/Win10

英文版 Outlook Express6.0, 兼容Win7/Win10/WinXP,解压就可用。

Python入门day06

回调函数就是一个参数,将这个函数作为参数传到另一个函数里面,当那个函数执行完之后,再执行传进去的这个函数。如果函数收到的是一个可变对象(如字典或列表)的引用,就能修改对象的原始值——相当于通过“传引用”来传递对象。面向过程:需要实现一个功能时,着重开发的步骤和过程,每个步骤都需要自己亲力亲为,需要编写代码(自己来做)类的属性:对象的特征描述(实际上是变量的定义)(本类创建的对象都能使用)类的方法:对象具有的行为(本质是函数),类中定义的函数即方法。函数的引用:如函数名的引用,函数传递时的引用传递。

m0_65651327的博客 1618

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

【Python-Day 41】揭秘函数的“魔法外衣”:一文彻底搞懂 Python 装饰器 (Decorator)

今天,我们将深入探讨一个 Python 中极其强大且富有魅力的特性——**装饰器 (Decorator)**。装饰器是 Python 函数式编程思想的杰出体现,它允许我们在不修改原函数代码的前提下,为其增加额外的功能。本文将从装饰器的基本概念、实现原理、语法糖 `@`,到 `functools.wraps` 的作用,再到带参数的装饰器和类装饰器等高级用法,为你构建一个完整而清晰的知识体系。通过本文,你将能彻底理解装饰器的工作机制,并学会在实际项目中灵活运用它来编写更优雅、更模块化的代码。

吴师兄大模型的博客 1980

【玩转python】入门篇day15-闭包、装饰器

Python中的装饰器(Decorator)是一个高级且非常有用的功能,它允许我们在不修改原有函数代码的情况下,给函数增加新的功能。详细讲解python中装饰器的不同用法

j15087159186的博客 471

python3层装饰器_python开发学习day16 (三层装饰器;迭代器)

2020-06-22                     目录:一、嵌套三层的装饰器二、迭代器2.1 迭代器是什么2.2 __iter__方法及其调用2.3 可迭代的对象2.4 迭代器对象2.5 for循环的原理2,6 总结迭代器一、嵌套三层的装饰器通过闭包的方式为函数体传参,可以包一层,也可以包两层@后面跟的必须是一个函数的内存地址,@函数名(参数)的形式也是可以的,前提是 “...

weixin_39950812的博客 136

Python装饰器

Python装饰器,递归,模块 先看一个Python执行过程 >>> def foo():            #定义函数 ...    print 'foo'           #执行函数打印字符串foo ... >>> foo<function foo at 0x7fd3a06f77d0>  #表示foo是一个函数&gt...

abtmh02622的专栏 92

python三层装饰器-python开发学习day16 (三层装饰器;迭代器)

2020-06-22                      目录:一、嵌套三层的装饰器二、迭代器2.1 迭代器是什么2.2 __iter__方法及其调用2.3 可迭代的对象2.4 迭代器对象2.5 for循环的原理2,6 总结迭代器一、嵌套三层的装饰器通过闭包的方式为函数体传参,可以包一层,也可以包两层@后面跟的必须是一个函数的内存地址,@函数名(参数)的形式也是可以的,前提是 “...

weixin_37988176的博客 213

python基础语法—day06(笔记)

文章目录主要内容:1.高阶函数2.闭包的概念3.计算代码的执行时长4.装饰器的基本使用5.os模块的使用 主要内容: 1.高阶函数 (1)把一个函数当成另一个函数的参数 在上一篇文章(day05)里讲到,map,filter,reduce,sort的使用就是把一个函数当成另一个函数的参数,在这篇文章中就不做讲解了。 (2)把一个函数当成另一个函数的返回值 def test(): print("我是test函数") return "hello" def test2(): print

weixin_43497769的博客 231

技术图文:Python的属性装饰器详解

背景 我们在以前的一篇图文 Python基础 – Task10. 类与对象 中介绍过利用property()方法既能保护类的封装特性,又能让开发者可以使用“对象.属性”的方式操作类属性。 class property([fget[, fset[, fdel[, doc]]]])用于在新式类中返回属性值。 fget – 获取属性值的函数 fset – 设置属性值的函数 fdel – 删除属性值函数...

老马的程序人生 1236

python语言day4 函数 生成器yield、next关键字 装饰器

print("执行info()函数")

weixin_45939821的博客 1155

Python学习 day5

在许多编程语言中,闭包的概念非常重要,特别是在处理异步编程和回调函数时。

alb3117149013的博客 998

Python学习Day29

学习来源:@浙大疏锦行类装饰器是 Python 中用于动态修改或增强类定义的高级工具,其核心在于​​,从而在不修改原始类代码的前提下扩展功能。

m0_64472246的博客 996
上一篇: Python_day_06_模块与包
下一篇: Python_day_07_文件操作
GodDevin
博客等级 码龄9年 39粉丝 71原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值