码迷,mamicode.com
首页 > 其他好文 > 详细

pythun装饰器详解

时间:2020-06-17 11:17:24      阅读:78      评论:0      收藏:0      [点我收藏+]

标签:cti   lan   直接   图片   code   返回值   rgs   log   输出   

本文链接:https://www.cnblogs.com/tujia/p/13144814.html

 

技术图片

一句话说明:print( get_something(params) ) 实例上调用的是 print( auth(get_something)(params) )

解释:

1)装饰器本身也是一个函数,并且它的返回值也必须是一个函数;

2)处理过程是把原函数当作参数传入装饰器函数,然后向返回的函数传入原函数的参数并执行,最后得到执行结果

 

Demo1 装饰器啥也不做,直接返回函数本身:

def auth(func):
    return func


@auth
def get_something():
    return 大宝贝


print(get_something())

# 大宝贝

注:装饰器返回的函数会被自动执行。

 

Demo2 装饰器返回了函数,但没处理原函数:

def auth(func):
    def anonymity():
        return 无关的东东
    return anonymity


@auth
def get_something():
    return 大宝贝


print(get_something())

# 无关的东东

注:返回anonymity函数会自动执行了,返回 "无关的东东";但 func(即 get_something)没有被处理到。

 

Demo3 装饰器内部函数返回被装饰函数:

def auth(func):
    def anonymity():
        return func
    return anonymity


@auth
def get_something():
    return 大宝贝


print(get_something())

# <function get_something at 0x057DB468>

注:这个demo乍看和Demo1是一样的,但其实是不一样的。auth装饰器返回的是 anonymity 函数会自动被执行,但返回的是 func 函数对象,func并没有被执行 。

 

Demo4 在auth装饰器里的anonmity函数里直接执行 get_something 但没返回结果:

def auth(func):
    def anonymity():
        func()
        return None
    return anonymity


@auth
def get_something():
    print(你调用了 get_something 函数)
    return 大宝贝


print(get_something())

# 你调用了 get_something 函数
# None

注:auth返回anonmity并被自动执行的时候,会调用func函数(也就是get_something函数)输出 ”你调用了 get_something 函数“,但没有接收和处理到 func() 的返回值,所以不会输出“大宝贝”。

 

Demo5 同上,但返回的不是None,是返回 func 的函数结果:

def auth(func):
    def anonymity():
        return func()
    return anonymity


@auth
def get_something():
    print(你调用了 get_something 函数)
    return 大宝贝


print(get_something())

# 你调用了 get_something 函数
# 大宝贝

注: anonymity被执行的时候,执行了 func(),并返回了 func() 的返回值。

 

Demo6 接收被装饰函数的参数:

def auth(func):
    def anonymity(token):
        if token == 123456:
            return func(token)
        else:
            return None
    return anonymity


@auth
def get_something(token):
    return 大宝贝


print(get_something(123456))
print(get_something(456789))

# 大宝贝
# None

注:anonymity接收了token参数但做了判断,判断是否执行 func 函数(原get_something函数)

 

Demo 7 接收原函数所有参数:

def auth(func):
    def anonymity(*args, **kwargs):
        if token in kwargs:
            token = kwargs[token]
        else:
            token = args[0]

        if token == 123456:
            return func(*args, **kwargs)
        else:
            return None
    return anonymity


@auth
def get_something(token):
    return 大宝贝


print(get_something(123456))
print(get_something(token=456789))

# 大宝贝
# None

注:关键是 *args 和 **kwargs

 

Demo8 带参数的装饰器:

def auth(source=‘‘):
    def wrap(func):
        def anonymity(*args, **kwargs):
            token = kwargs[token] if token in kwargs else args[0]

            if source == app and token == 123456:
                return func(*args, **kwargs)
            elif source == m and token == 456789:
                return func(*args, **kwargs)
            else:
                return None
        return anonymity
    return wrap


@auth(source=app)
def app_get_something(token):
    return 大宝贝


@auth(source=m)
def m_get_something(token):
    return 大宝贝


print(app_get_something(token=123456))
print(m_get_something(token=456789))

# 大宝贝
# 大宝贝

注:当装饰器增加传入参数时,装饰器要多嵌套一层函数,原函数被当作参数传给装饰器的返回函数,原函数的参数被传入装饰器的返回函数的返回函数

即:auth(source=‘app‘)(app_get_something)(token=‘123456‘) 、auth(source=‘m‘)(m_get_something)(token=‘456789‘)

 


 

完。

 

本文链接:https://www.cnblogs.com/tujia/p/13144814.html

pythun装饰器详解

标签:cti   lan   直接   图片   code   返回值   rgs   log   输出   

原文地址:https://www.cnblogs.com/tujia/p/13144814.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!