Python装饰器浅析

这是我参与更文挑战的第 30 天,活动详情查看: 更文挑战

1. 概述

装饰器是使用@符号引用已有的函数后,可用于修饰其他函数装饰被修饰的函数。

当程序使用“@函数”(比如函数A)装饰另一个函数(比如函数B)时,有两步:

  1. 将被修饰的函数(函数B)作为参数传给@符号引用的函数(函数A)
  2. 将函数B替换(装饰)成第1步的返回值

最后,被“@函数”修饰的函数不再是原来的函数,而是被替换换成一个新东西。

装饰器分为步内置装饰器和自定义装饰器。

装饰器类型

  • @classmethod,修饰的方法就是类方法
  • @staticmethod,修饰的方法是静态方法
  • @property,将方式调用变成属性调用
  • 自定义装饰器,根据功能创建自定义装饰器对其他函数进行修饰

Python内置装饰器详情,欢迎查看Python关于类内存分析一文也有讲述

好呐,我们来详细看看装饰器具体的用法,let’s go~

2. 内置装饰器

2.1 @classmethod

类方法是从属于类对象的方法。类方法通过装饰器@classmethod来定义

类方法中不能使用实例属性和s

@classmethod
def 类方法名(cls,[形参列表]):
    函数体
复制代码

举个?,来看看作用

class Animal:

    zone = "Asia" #类属性

    def __init__(self,name):
        self.name = name

    @classmethod
    def zoneinfo(cls):
        print(cls.zone)

#类调用

Animal.zoneinfo()

#对象调用
cat = Animal("Tome")
cat.zoneinfo()

复制代码

类方法运行结果

2.2 @staticmethod

Python 中允许定义与类对象无关的方法,称为静态方法。

静态方法和在模块中定义普通函数没有区别

但是静态方法放到类的名字空间里面,需要通过“类调用”,需要创建对象,不会隐式传递self

静态方法通过装饰器@staticmethod来定义,格式如下:

@staticmethod
def 静态方法名([形参列表]):
    函数体
复制代码

举个?,来看看作用


class Animal:

    zone = "Asia" #类属性

    def __init__(self,name):
        self.name = name

    @staticmethod
    def food(food1,food2):

        print("喜欢吃的食物为:{0},{1}".format(food1,food2))
#类调用

Animal.food("Apple","Orange")

#对象调用
cat = Animal("Tome")
cat.food("Apple","Orange")

复制代码

静态方法运行结果

2.3 @propety

@property可以将一个方法的调用方式变成属性调用。通常代替gettar和settar方法,操作方便

@property
def 函数名():
   函数体
复制代码
class Student:

    def __init__(self,name,score):
        self.name = name
        self.__score = score


    @property
    def score(self):  # Score方法当成属性来使用
        print("Loading....")
        return self.__score

    @score.setter
    def score(self,score):
        if -1 < score < 101:
            self.__score = score
        else:
            print("成绩错误")

stu = Student("Tome",85)
print("初始成绩:",stu.score)
#重新输入成绩
stu.score = 100
print("新成绩:",stu.score)
复制代码

@property运行结果

3. 自定义装饰器

我们可以定义自定义函数作为装饰器,用@修饰其他的函数,来作为执行函数时“前置操作”。

  • 装饰器本质上是一个Python函数,它可以让其他函数在不需要做任何代码变动的前提下增加额外功能,装饰器的返回值也是一个函数对象
  • 装饰器使用场景有:插入日志、性能测试、事务处理、缓存、权限校验等场景。
  • 抽离出大量与函数功能本身无关的雷同代码并继续重用

装饰器的形式常见有四类如下:

  1. 不带参数装饰器
  2. 带参数装饰器
  3. 带不定参数装饰器
  4. 基于类实现的装饰器

我们本期先初步认识装饰器,后面我们再来深入的学习怎么创建自定义装饰器

我们来看一个栗子?,来看看实现一个简单的装饰器插入日志打印,体验一把自动定义装饰器

def Mylogging(func):

    def wrapper(info):

        print("function {func}()".format(func=func.__name__))

        print("开始执行中..")

        return func(info)
    return wrapper

@Mylogging
def test(info):

    print("{0}".format(info))

#调用被Mylogging装饰的test方法
test("JueJing")

复制代码

简单装饰器运行结果

总结

我们今天学习了Python3个内置装饰器(@classmethod,@staticmethod,@property),根据需求我们也可以自定义装饰器去修饰其他的函数。

被装饰器修饰的函数,总是被替换成@符号所引用的函数的返回值,如果@符号所引用的函数返回值是函数,那么被修饰的函数在替换之后还是函数。

总之,装饰器概述地讲就是类似于我们使用测试用例之前的一些前置操作

好啦,以上是本期内容,欢迎大家评论区评论,点赞关注,下次见~

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享