Python全栈之路系列之装饰器

作者: 2890bd62c72a | 来源:发表于2019-10-09 14:45 被阅读0次

装饰器是由函数去生成的,用于装饰某个函数或者方法或者类,他可以让这个函数在执行之前或者执行之后做一些操作。

实例

先定义一个函数func

#!/usr/bin/env python
# _*_ coding: utf-8 _*_

def func(arg):  # 接受一个参数arg
    print(arg)  # 输出这个参数

func("Hello World!")  # 调用脚本并且传入参数

执行脚本,输出的结果为:

C:\Python35\python.exe F:/Python_code/Note/装饰器.py
func

Process finished with exit code 0

现要在执行func这个函数前后执行一些操作,就可以创建一个装饰器来实现:

在学习过程中有什么不懂得可以加我的
python学习交流扣扣qun,784758214
群里有不错的学习视频教程、开发工具与电子书籍。
与你分享python企业当下人才需求及怎么从零基础学习好python,和学习什么内容
#!/usr/bin/env python
# _*_ coding: utf-8 _*_

def decorator(func):  # 创建一个装饰器函数,接受的参数arg参数就是func函数名

    def inner(*args, **kwargs):
        print("执行函数之前")
        ret = func(*args, **kwargs)
        print("执行函数之后")
        return ret

    return inner

@decorator  # 如果要让某个函数使用装饰器,只需要在这个函数上面加上@+装饰器名
def func(arg):
    print(arg)

func("Hello World!")

输出结果为:

/usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py
执行函数之前
Hello World!
执行函数之后

Process finished with exit code 0

多个装饰器装饰同一个函数

#!/usr/bin/env python
# _*_ coding: utf-8 _*_

def decorator1(func):
    def inner():
        print("开始之前执行装饰器01")
        ret = func()
        print("结束之后执行装饰器01")
        return ret

    return inner

def decorator2(func):
    def inner():
        print("decorator2>>>Start...")
        ret = func()
        print("decorator2>>>End...")
        return ret

    return inner

@decorator1
@decorator2
def index():
    print("执行函数...")

index()

输出结果:

/usr/bin/python3.5 /home/ansheng/Documents/PycharmProjects/blogcodes/装饰器.py
开始之前执行装饰器01
decorator2>>>Start...
执行函数...
decorator2>>>End...
结束之后执行装饰器01

Process finished with exit code 0

更多实例

#!/usr/bin/env python
# _*_ coding:utf-8 _*_

# Created by 安生 on 2017/2/9

"""
函数装饰器
"""

def decorator(func):
    def wrapped(*args, **kwargs):
        return func(*args, **kwargs)

    return wrapped

@decorator
def func(a, b):
    return a + b

print(func(1, 2))
"""
类装饰器
"""

class decorator:
    def __init__(self, func):
        self.func = func

    def __call__(self, *args, **kwargs):
        return self.func(*args, **kwargs)

@decorator
def func(a, b):
    return a + b

print(func(1, 2))
"""
带参数的函数装饰器
"""

def parameter(a, b):
    print(a, b)

    def decorator(func):
        def wrapped(*args, **kwargs):
            return func(*args, **kwargs)

        return wrapped

    return decorator

@parameter(1, 2)
def func(a, b):
    return a + b

print(func(10, 20))
"""
带参数的类装饰器
"""

def parameter(a, b):
    print(a + b)

    class decorator:
        def __init__(self, func):
            self.func = func

        def __call__(self, *args, **kwargs):
            return self.func(*args, **kwargs)

    return decorator

@parameter(1, 2)
def func(a, b):
    return a + b

print(func(10, 20))

"""
带参数的类装饰器
"""

def parameter(a, b):
    print(a, b)

    def decorator(cls):
        class wrapped:
            def __init__(self, *args, **kwargs):
                self.cls = cls(*args, **kwargs)

            def __getattr__(self, item):
                return getattr(self.cls, item)

        return wrapped

    return decorator

@parameter(1, 2)
class CLS:
    def __init__(self):
        self.a = 'a'

    def P(self, v):
        print(v)

obj = CLS()
print(obj.a)
obj.P('Hello,')

"""
为函数中和类中的方法添加装饰器
"""

def Call(aClass):
    calls = 0

    def onCall(*args, **kwargs):
        nonlocal calls
        calls += 1
        print('call %s to %s' % (calls, func.__name__))
        return aClass(*args, **kwargs)

    return onCall

@Call
def func(a, b):
    return a + b

print(func(1, 2))

class CLS:
    def __init__(self):
        self.a = 'a'

    @Call
    def b(self):
        return self.a

obj = CLS()
print(obj.b())

如果你依然在编程的世界里迷茫,可以加入我们的Python学习扣qun:784758214,看看前辈们是如何学习的!交流经验!自己是一名高级python开发工程师,从基础的python脚本到web开发、爬虫、django、数据挖掘等,零基础到项目实战的资料都有整理。送给每一位python的小伙伴!分享一些学习的方法和需要注意的小细节,点击加入我们的 python学习者聚集地

相关文章

  • Python全栈之路系列之装饰器

    装饰器是由函数去生成的,用于装饰某个函数或者方法或者类,他可以让这个函数在执行之前或者执行之后做一些操作。 实例 ...

  • Python全栈之路系列文章

    Python全栈之路系列文章 https://blog.ansheng.me/article/python-ful...

  • 【Python全栈之路】-转

    Python全栈之路系列文章 -- 分享自SegmentFault 原文链接:https://segmentfau...

  • Python全栈之路系列之socket

    socket是网络连接端点。例如当你的Web浏览器请求baidu.com的网站时,你的Web浏览器创建一个sock...

  • Python全栈之路系列之递归

    所谓递归其实就是函数本身调用函数,直到满足指定条件之后一层层退出函数, 例如 从前有座山,山里有座庙,庙里有个老和...

  • Python全栈之路系列之socket

    socket是网络连接端点。例如当你的Web浏览器请求ansheng.me的网站时,你的Web浏览器创建一个soc...

  • Python全栈之路系列之RabbitMQ

    RabbitMQ是实现了高级消息队列协议(AMQP)的开源消息代理软件。RabbitMQ服务器是用Erlang语言...

  • Python全栈之路系列之SQLAlchemy

    SQLAlchemy的是Python SQL工具包和对象关系映射器,让应用程序开发者的全部功能和SQL的灵活性。 ...

  • Python全栈之路系列之反射

    反射的定义 根据字符串的形式去某个对象中操作成员 根据字符串的形式去一个对象中寻找成员 根据字符串的形式去一个对象...

  • Python全栈之路系列之函数

    函数 函数是Python为了代码最大程度的重用和最小化代码冗余而提供的最基本的程序结构。 函数式:将某功能代码封装...

网友评论

    本文标题:Python全栈之路系列之装饰器

    本文链接:https://www.haomeiwen.com/subject/ovznjctx.html