当前位置: 首页 > news >正文

面试官说了,不懂Python装饰器的人直接Pass

01 装饰器

Python的装饰器是面试常被问到的问题之一,如果你的简历里描述会Python,那么大概率会被问到那么我们应该怎么回答这个问题呢?这里我从几个角度来解释装饰器的作用,大家可以挑选符合自己的说法

1.python装饰器原理基础

Python中的装饰器,本质上就是一个高阶函数,这里高阶函数指定就是"一个返回值是函数的函数"

2.装饰器的语法

在python中使用装饰器,有两个组成部分

@符号调用装饰器

定义被装饰的方法

范例如下:

@装饰器名字 定义被装饰的函数 @logger def func(): pass

3.一般用来做什么?

装饰器可以在不修改函数的情况下,增加额外的功能。这是官方给装饰器的定义

实际上我们会把一些业务功能之外的,附属需求用装饰器来实现。比如:为我们的函数添加日志记录,性能监控器,埋点计数器。大家也都知道,修改写好的函数是非常麻烦并且容易出错的一件事。所以很适合“在不修改函数内部代码的前提下,为它包装一些额外的功能”也就是装饰器

4.常用的装饰器

staticmethod 用来修饰类中的方法,使得该方法可以直接用类名访问,如cls.foo()。

classmethod 和staticmehod类似,区别在于staticmethod,classmethod会将class传入被修饰的方法中

class A(object): a = 1 def __init__(self): self.a = 2 @staticmethod def foo1(): print A.a @classmethod def foo2(cls): print "class a is", cls.a print "instance a is", cls().a

property 可以将属性的访问和赋值用函数来实现,从而可以在函数里添加参数检查等一些功能,同时外部使用时访问和赋值的方式并不发生变化。

注意访问和赋值的方法名是一样的

class A(object): def __init__(self): self.__count = 0 @property def count(self): return self.__count @count.setter def count(self, value): if not isinstance(value, int): raise ValueError('count must be an integer!') self.__count = value a = A() print a.count a.count = 1 print a.count a.count = "a" # raise ValueError

functools.wraps 用在装饰器的代码里。可以把原始函数的name等属性复制到wrapper()函数中,这样就可以获取到真实函数的name属性,而不是wrapper

import functools def log(text): def decorator(func): @functools.wraps(func) def wrapper(*args, **kw): print '%s %s():' % (text, func.__name__) return func(*args, **kw) return wrapper return decorator 5.怎么手写一个装饰器 #!/anaconda3/envs/FEALPy/bin python3.7 # -*- coding: utf-8 -*- # --- # @File: 装饰器语法.py # @Author: Bull # --- # 定义装饰器函数 # 1.简单装饰器范例 def logger(func):#在python里,一切都是对象 def wrapper(*args,**kw): print("进入装饰器函数了") func(*args,**kw)#真正的函数在装饰器重新调用 func(*args, **kw) print("装饰器功能执行完毕") return wrapper @logger#=logger(add) def add(x,y): print('进入被修饰的函数') print(f'{x}+{y}={x+y}') # add(1,2) # 2.带参数的装饰器 def say_hello(contry): def wrapper(func): def second(*args,**kw): if contry == 'china': print("来自装饰器的‘你好’") elif contry == 'america': print('来自装饰器的"hello"') else: return func(*args,**kw) return second return wrapper @say_hello('america') def american(): print("I am from America") @say_hello('china') def china(): print('我来自中国') american() print('*'*30) china()

感谢每一个认真阅读我文章的人!!!

作为一位过来人也是希望大家少走一些弯路,如果你不想再体验一次学习时找不到资料,没人解答问题,坚持几天便放弃的感受的话,在这里我给大家分享一些自动化测试的学习资源,希望能给你前进的路上带来帮助。

软件测试面试文档

我们学习必然是为了找到高薪的工作,下面这些面试题是来自阿里、腾讯、字节等一线互联网大厂最新的面试资料,并且有字节大佬给出了权威的解答,刷完这一套面试资料相信大家都能找到满意的工作。

视频文档获取方式:
这份文档和视频资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!以上均可以分享,点下方小卡片即可自行领取。

http://www.cnnetsun.cn/news/66825.html

相关文章:

  • 一文带你了解使用ARP欺骗的中间人 (MiTM) 攻击,黑客技术零基础入门到精通教程!
  • 【问题排查】No spring.config.import property has been defined
  • Dify连接外部数据库存储PyTorch模型输出结果
  • 基于SVM代理模型的电机多目标优化:平均转矩、转矩脉动及推力径向优化的高精度实现
  • 三分钟上手DNN多输出预测(附保姆级代码)
  • 什么是苹果MFi认证,有什么优势?
  • Conda与Pip双管齐下:优化PyTorch-CUDA依赖安装流程
  • PyTorch 权重剪枝中的阈值计算:深入解读 numel() 和 torch.kthvalue()
  • CKA-Agent:揭示商业LLM安全防线的“特洛伊知识“漏洞
  • 构筑智能心理新基建:北京朗心致远AI心理场室与设备整体解决方案
  • 【众包 + AI智能体】AI境生态巡查平台边防借鉴价值专项调研——以广西边境线治理为例
  • AutoGPT支持GraphQL订阅模式了吗?实时更新测试
  • Miniconda集成virtualenv,双剑合璧管理复杂AI项目
  • 从 “PPT 加班狗” 到 “10 分钟出稿大师”:paperzz AI PPT 生成器,藏在学术工具里的效率黑科技
  • 「学术协作者图谱」:PaperZZ领衔的9款AI毕业论文辅助工具全景测评——以“认知脚手架”为轴心的功能解构与伦理适配指南
  • 从 “熬夜改 PPT” 到 “10 分钟出稿”:paperzz AI PPT 生成器如何重构职场 / 学业演示效率?
  • 从 “文献堆里找线索” 到 “1 小时出框架”:paperzz AI 文献综述,把学术苦力活变成 “逻辑拼图游戏”
  • transformer模型详解:以Qwen3-32B为例剖析架构设计
  • 清华源加速下载Qwen3-8B模型文件及依赖组件
  • 如何在单张GPU上部署Qwen3-VL-8B实现高效图像识别
  • AutomationOperation2.60自动操作工具:可视化 GUI支持鼠标 键盘 识别等自动化操软件作
  • 【机器学习】PAC学习理论及实现
  • 计算机硬件解剖:从拆解到性能优化
  • 基于STM32单片机盲人导航 导盲杖 智能拐杖系统 超声波测距 老人防丢 防摔到 跌倒检测报警 物联网控制系统 DIY 成品套件 DIY设计 实物+源程序+原理图+仿真+其它资料
  • AutoGPT联网搜索功能如何启用?详细配置说明来了
  • 企业内部智能客服新选择:基于LobeChat的定制化解决方案
  • AutoGPT镜像用户增长数据曝光:三个月突破10万下载
  • Python 1级编程考试模拟题库(5套精选)
  • 从零开始部署LobeChat:打造个人专属的大模型对话门户
  • Jenkins环境配置篇-更换插件源