服务器之家

服务器之家 > 正文

Python 装饰器代码解析

时间:2022-02-23 11:08     来源/作者:TORTOISR

前言

以往看到我博客的小伙伴可能都知道,我的前言一般都是吐槽和讲废话环节,哈哈哈哈。今天难得休息,最近可真是太忙了,博主已经连续一年都在996了,所以最近没怎么学习新东西,只能回顾以往的旧知识了,上周一起工作的小伙伴扛不住996离职了,我们三人的小团队也正式解散了,哎。原本想着找时间好好整理一个关于关于接口自动化测试或ceph相关的东西。但由于篇幅过长这里目前可能不会着手写这方面东西。其实啊写是很简单的,主要例子难找。哈哈哈哈。
好了回归正题吧。看过我以往博客的小伙伴肯定见我用过@parameterized.expand()用作参数化的装饰器。这属于系统定义装饰器,当然我们自己也可以自定义装饰器已适合我们日常的开发需求。
**什么是装饰器:**装饰器的本质就是一个函数,作用是在不改变源代码的情况下,给函数增加额外的功能;装饰器的使用通过@语法糖进行调用。

普通装饰器:

直接上代码吧。

def demo(func_test):
  def wrapper():
      print('定义的第一个装饰器')
      func_test()
      print('装饰器结束')
  return wrapper    #这里注意不要加括号


@demo
def func_test():
  print('小白小白!!!!')

Python 装饰器代码解析

直接使用自定义装饰器强化的原方法。
带有参数的装饰器:

def demo(func_test):
  def wrapper(name):
      print('定义的第一个装饰器')
      func_test(name)
      print('哦,你就是%s啊'%name)
      print('装饰器结束')
  return wrapper


@demo
def func_test(name):
  print('大家好我叫%s'%name)

Python 装饰器代码解析

是不是有点感觉了啊。
接下来就是不带自定义参数的装饰器

def demo(func_test):
  def wrapper(*name,**kwargs):
      print('定义的第一个装饰器')
      func_test(*name,**kwargs)
      print('哦,你就是%s啊'%name[0])
      print('你今年%s岁啊'%name[1])
      print('装饰器结束')
  return wrapper


@demo
def func_test(name,age):
  print('大家好我叫%s'%name)
  print('今年{}'.format(age))

Python 装饰器代码解析

是不是很简答啊。哈哈哈哈
多个装饰一起使用。

def deco01(func):
  def wrapper(*args,**kwargs):
      print('第一层的装饰器')
      func(*args,**kwargs)
      print('第一层装饰器结束')
  return wrapper


def deco02(func):
  def wrapper(*args,**kwargs):
      print('这是第二层装饰器')
      print('第二层装饰器结束')
      func(*args, **kwargs)
  return wrapper


@deco02
@deco01
def func(a,b,c,name):
  print('hello ,here is a func')
  print("result is %d" %(a+b+c))
  print('name:{}'.format(name))

Python 装饰器代码解析

看看执行顺序可以看出装饰器是从上往下执行的。
类装饰器:
在使用装饰器时我们总不能在一个文件里写的都是装饰器和各个方法吧,总是要分开的。这里就要是讲一个类装饰器。
这里呢,我大概了写了一个读取文件装饰器的例子。

class Mydecorator():
  def __init__(self,func):
  # 定义为私有属性
      self.func = func
  # 实现__call__方法,让对象变成可以调用的对象,可调用的对象可以想函数那样使用
  def __call__(self, *args, **kwargs):   
      print('测试类装饰器')
      self.func(*args)
      catalogue = args[0]
      suffix = catalogue.split('.')[2]
      try:
          if suffix == 'json':
              with open(*args,'r',encoding='utf-8') as file_object:
                  contents = json.load(file_object)
                  print(contents)
          else:
              with open(*args,'r',encoding='utf-8') as file_object:
                  contents = file_object.read()
                  print(contents)
      except Exception as a:
          print('读取文件出错拉:{}'.format(a))
@Mydecorator
def name(name):
  print('请输入对应文件路径:%s'%name)

Python 装饰器代码解析

是不是很好用啊。哈哈哈哈

到此这篇关于Python 装饰器代码解析的文章就介绍到这了,更多相关Python 装饰器内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/HUJIANLAILE/article/details/121065820

标签:

相关文章

热门资讯

蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整
蜘蛛侠3英雄无归3正片免费播放 蜘蛛侠3在线观看免费高清完整 2021-08-24
2022年最旺的微信头像大全 微信头像2022年最新版图片
2022年最旺的微信头像大全 微信头像2022年最新版图片 2022-01-10
背刺什么意思 网络词语背刺是什么梗
背刺什么意思 网络词语背刺是什么梗 2020-05-22
yue是什么意思 网络流行语yue了是什么梗
yue是什么意思 网络流行语yue了是什么梗 2020-10-11
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全
2020微信伤感网名听哭了 让对方看到心疼的伤感网名大全 2019-12-26
返回顶部