美文网首页
Python装饰器

Python装饰器

作者: Aresx | 来源:发表于2019-07-11 17:52 被阅读0次

Python装饰器

装饰器作用

  • 装饰器可也用来扩展函数或者类的功能,在不改变原有主体函数或类的情况下,简便的为其扩展功能。
  • 因为装饰器内功能调用在主体前,所以可以拦截主体函数调用或拦截主体类创建实例,并且处理它们。

函数装饰器

一个简单的装饰器,没有任何意义,仅是展示装饰器的用法。

def my_decorator(func):
    def wrapper():
        print("warpper")
        return func()

    print("my_decorator")
    return wrapper


@my_decorator
def show():
    print("show")


show()
print("函数名:%s" % show.__name__)

输出:

my_decorator
warpper
show
函数名:wrapper

这其中有一个问题,show()函数的名字已经改变,因为在装饰器中返回的是包装过的wrapper(*args, **kwargs)函数。如果要解决这个问题,可以引入官方包import functools,代码如下:

import functools


def my_decorator(func):
    @functools.wraps(func)
    def wrapper():
        print("warpper")
        return func()

    print("my_decorator")
    return wrapper


@my_decorator
def show():
    print("show")


show()
print("函数名:%s" % show.__name__)

输出:

my_decorator
warpper
show
函数名:show

可以看到函数名已经回复正常。一般装饰器的使用都会是对原有函数进行功能扩充,所以原函数有参的话也可以传入装饰器。两个整数加法,如不是整数提示错误。

import functools


def my_decorator(func):
    @functools.wraps(func)
    def wrapper(*args, **kwargs):
        for i in range(len(args)):
            if not isinstance(args[i], int):
                print("输入错误,请输入整数")
                return
        return func(*args, **kwargs)

    return wrapper


@my_decorator
def add(x, y):
    print("加法结果:%d" % (x + y))


add(11, 22)

类装饰器

可以为一个类添加装饰器,不改变类原有代码的情况下,为类添加或修改属性,也可以为类增加函数。

import functools


def my_decorator(cls):
    def show():
        print("新加入函数")

    @functools.wraps(cls)
    def wrapper():
        cls.name = "张三"
        cls.age = 20
        cls.show = show
        return cls

    return wrapper


@my_decorator
class A:
    def __init__(self):
        self.name = "小明"
        print("init")


a = A()
print(a.age)
print(a.name)
a.show()

输出:

20
张三
新加入函数

Adef __init__(self)并没有执行,已经被装饰器拦截。装饰器为A添加了属性和函数。

初学python,如对知识点理解有误还请指正。欢迎补充不足之处,看到后我会及时补充进文章中。

相关文章

  • 装饰器模式

    介绍 在python装饰器学习 这篇文章中,介绍了python 中的装饰器,python内置了对装饰器的支持。面向...

  • python中的装饰器

    python装饰器详解 Python装饰器学习(九步入门) 装饰器(decorator) 就是一个包装机(wrap...

  • [译] Python装饰器Part II:装饰器参数

    这是Python装饰器讲解的第二部分,上一篇:Python装饰器Part I:装饰器简介 回顾:不带参数的装饰器 ...

  • Python中的装饰器

    Python中的装饰器 不带参数的装饰器 带参数的装饰器 类装饰器 functools.wraps 使用装饰器极大...

  • Python进阶——面向对象

    1. Python中的@property   @property是python自带的装饰器,装饰器(decorat...

  • Python 装饰器填坑指南 | 最常见的报错信息、原因和解决方

    Python 装饰器简介装饰器(Decorator)是 Python 非常实用的一个语法糖功能。装饰器本质是一种返...

  • Python装饰器

    Python装饰器 一、函数装饰器 1.无参装饰器 示例:日志记录装饰器 2.带参装饰器 示例: 二、类装饰器 示例:

  • python3基础---详解装饰器

    1、装饰器原理 2、装饰器语法 3、装饰器执行的时间 装饰器在Python解释器执行的时候,就会进行自动装饰,并不...

  • 2019-05-26python装饰器到底是什么?

    装饰器例子 参考语法 装饰器是什么?个人理解,装饰器,是python中一种写法的定义。他仍然符合python的基本...

  • 2018-07-18

    Python装饰器 装饰,顾名思义,是用来打扮什么东西的。Python装饰...

网友评论

      本文标题:Python装饰器

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