python基础学习-有参装饰器

一、有参装饰器:

1、知识储备

由于语法糖@的限制,outter函数只能有一个参数,并且该才是只用来接收被装饰对象的内存地址

def outter(func):
?
#func = 函数的内存地址
?
    def wrapper(*args,**kwargs):
        res=func(*args,**kwargs)
        return res
    return wrapper
?
@outter # index=outter(index) # index=>wrapper
@outter # outter(index)
def index(x,y):
    print(x,y)

2、偷梁换柱=》有参装饰器

index的参数什么样子,wrapper的参数就应该什么样子 index的返回值什么样子,wrapper的返回值就应该什么样子 index的属性什么样子,wrapper的属性就应该什么样子==》from functools import wraps

2.1 山炮玩法1:

def auth(func,db_type):
    def wrapper(*args, **kwargs):
        name=input(‘your name>>>: ‘).strip()
        pwd=input(‘your password>>>: ‘).strip()
?
        if db_type == ‘file‘:
            print(‘基于文件的验证‘)
            if name == ‘egon‘ and pwd == ‘123‘:
                res = func(*args, **kwargs)
                return res
            else:
                print(‘user or password error‘)
        elif db_type == ‘mysql‘:
            print(‘基于mysql的验证‘)
        elif db_type == ‘ldap‘:
            print(‘基于ldap的验证‘)
        else:
            print(‘不支持该db_type‘)
?
    return wrapper
?
@auth  # 账号密码的来源是文件
?
def index(x,y):
    print(‘index->>%s:%s‘ %(x,y))
?
@auth # 账号密码的来源是数据库
?
def home(name):
    print(‘home->>%s‘ %name)
?
@auth # 账号密码的来源是ldap
?
def transfer():
    print(‘transfer‘)
?
?
index=auth(index,‘file‘)
home=auth(home,‘mysql‘)
transfer=auth(transfer,‘ldap‘)
?
#index(1,2)
?
#home(‘egon‘)
?
#transfer()

2.2 山炮玩法2:

def deco(func):
    def wrapper(*args, **kwargs):
        name = input(‘your name>>>: ‘).strip()
        pwd = input(‘your password>>>: ‘).strip()
?
        if db_type == ‘file‘:
            print(‘基于文件的验证‘)
            if name == ‘egon‘ and pwd == ‘123‘:
                res = func(*args, **kwargs)
                return res
            else:
                print(‘user or password error‘)
        elif db_type == ‘mysql‘:
            print(‘基于mysql的验证‘)
        elif db_type == ‘ldap‘:
            print(‘基于ldap的验证‘)
        else:
            print(‘不支持该db_type‘)
?
    return wrapper
?
return deco
?
deco=auth(db_type=‘file‘)
@deco # 账号密码的来源是文件
def index(x,y):
    print(‘index->>%s:%s‘ %(x,y))
?
deco=auth(db_type=‘mysql‘)
@deco # 账号密码的来源是数据库
def home(name):
    print(‘home->>%s‘ %name)
?
deco=auth(db_type=‘ldap‘)
@deco # 账号密码的来源是ldap
def transfer():
    print(‘transfer‘)
?
index(1,2)
home(‘egon‘)
transfer()

2.3 语法糖

def auth(db_type):
    def deco(func):
        def wrapper(*args, **kwargs):
            name = input(‘your name>>>: ‘).strip()
            pwd = input(‘your password>>>: ‘).strip()
?
            if db_type == ‘file‘:
                print(‘基于文件的验证‘)
                if name == ‘egon‘ and pwd == ‘123‘:
                    res = func(*args, **kwargs)  # index(1,2)
                    return res
                else:
                    print(‘user or password error‘)
            elif db_type == ‘mysql‘:
                print(‘基于mysql的验证‘)
            elif db_type == ‘ldap‘:
                print(‘基于ldap的验证‘)
            else:
                print(‘不支持该db_type‘)
        return wrapper
    return deco
?
?
@auth(db_type=‘file‘)  # @deco # index=deco(index) # index=wrapper
def index(x, y):
    print(‘index->>%s:%s‘ % (x, y))
?
@auth(db_type=‘mysql‘)  # @deco # home=deco(home) # home=wrapper
def home(name):
    print(‘home->>%s‘ % name)
?
@auth(db_type=‘ldap‘)  # 账号密码的来源是ldap
def transfer():
    print(‘transfer‘)
?
#index(1, 2)
?
#home(‘egon‘)
?
#transfer()

3、有参装饰器模板

def 有参装饰器(x,y,z):
    def outter(func):
        def wrapper(*args, **kwargs):
            res = func(*args, **kwargs)
            return res
        return wrapper
    return outter
?
@有参装饰器(1,y=2,z=3)
def 被装饰对象():
    pass
 

原文地址:https://www.cnblogs.com/dingbei/p/12568522.html

时间: 2024-10-13 11:14:36

python基础学习-有参装饰器的相关文章

python中的无参装饰器和有参装饰器

python中的无参装饰器和有参装饰器 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 装饰器特点: 1>.开放封闭原则,即对扩展是开放的,对修改时封闭的: 2>.装饰器本质可以是任意可调用的对象,被装饰的对象也可以是任意可调用对象: 3>.装饰器的功能是在不修改被装饰器对象源代码以及被装饰器对象的调用方式的前提下为其扩展新功能: 4>.装饰器本质是函数,(即装饰其他函数)就是为其他函数添加附加功能. 一.典型装饰器案例 1 #!/usr/bin/env pyth

Python基础(八)装饰器

今天我们来介绍一下可以提升python代码逼格的东西——装饰器.在学习装饰器之前我们先来复习一下函数的几个小点,方便更好的理解装饰器的含义. 一.知识点复习 1, 在函数中f1和f1()有什么不同,f1:表示的是将整个函数看作一个整体:f1():表示执行f1函数,下面通过一个例子来看一下: 1 2 3 4 5 def f1():     print('f1') f1                    #代表函数体本身,什么也不操作 f1()                  #代表执行函数

Day4 - Python基础4 迭代器、装饰器、软件开发规范

Python之路,Day4 - Python基础4 (new版) 本节内容 迭代器&生成器 装饰器 Json & pickle 数据序列化 软件目录结构规范 作业:ATM项目开发 1.列表生成式,迭代器&生成器 列表生成式 孩子,我现在有个需求,看列表[0, 1, 2, 3, 4, 5, 6, 7, 8, 9],我要求你把列表里的每个值加1,你怎么实现?你可能会想到2种方式 >>> a [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] >>

Python基础day-7[闭包,装饰器]

闭包: 首先说下闭包是什么? 闭包就是在函数内部定义的函数,包含对外部作用域的引用,但不包含全局作用域.因为函数的作用域在定义的时候就固定死了,所以闭包函数有自带作用域和延迟计算的特点. 闭包函数定义:如果一个内部函数,包含了对外部作用域的引用,但是不是包含全局作用域.那么这个函数就被认为是闭包函数.闭包函数可以使用".__closure__" 来查看闭包函数的属性.下面我们来看一个示例: def t(): money = 100 def s(): print(money) retur

Python之路【第四篇】:Python基础(19)——装饰器

#普通装饰器# (@+函数名),需要记住关键两点:#功能:#1.自动执行outer函数,并且将其下面的函数名f1当作参数传递#2.将outer函数的返回值,重新赋值给f1 # #装饰器必备# ####第一:函数名和执行函数##### def foo(): #创建函数# print('hello') #函数体# foo #表示是函数名,代指整个函数# foo() #表示执行f00函数# # 输出:hello # ####第二:函数被重新定义#### def foo():# print("foo1&

Step4 - Python基础4 迭代器、装饰器、软件开发规范

1.装饰器 定义:本质是函数,就是为其他函数添加附加功能 原则:1.不能修改被装饰的函数的源代码 2.不能修改被装饰的函数的调用方式 例子: import time def timer(func): def warpper(*args,**kwargs): start_time = time.time() func() stop_time = time.time() print("the func run time is %s" % (stop_time-start_time)) re

Python 基础之八步理解装饰器

装饰器装饰器:在不改变原有代码的情况下,为该原函数扩展新功能特征:返回信函数,替换旧函数语法:@ 语法糖#(1) 装饰器原型#例1: def kuozhan(func):    def newfunc():        print("吃饭前,无精打采")        func()        print("吃饭后,精神百倍")    return newfuncdef func():    print("我是个吃货")#手动的 把新函数 赋

python基础09--闭包,装饰器

1.1 闭包 1.函数作为第一类对象,支持赋值给变量,作为参数传递给其它函数,作为其它函数的返回值,支持函数的嵌套,实现了__call__方法的类实例对象也可以当做函数被调用 2.s= func  -->执行函数的内存地址 s =func() -->函数的调用 3.闭包:嵌套函数,内部函数调用外部函数的变量 可以让一个局部变量常驻内存 def  outer(): a=1 def inner():       #闭包函数 pritn(a) print(inner.__closuer__)  #如

Python学习之路-装饰器&生成器&正则表达式

装饰器 通俗的讲,装饰器就是在不改变源代码基础上,给源代码增加新功能. 不改变函数的源代码.调用方式.返回值等,给函数增加新功能. 经典案例:登录装饰器, def login_decorator(func):     def inner():         if USER_TEMP["status"] == False:             print("\033[31;1m用户未登录,请先登录\033[0m")             login_atm()