不学会装饰器,面试不敢说自己会Python
本文章出自【码同学软件测试】
码同学公众号:自动化软件测试,领取资料可加:Matongxue_8
码同学抖音号:小码哥聊软件测试
装饰器
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
免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可加:Matongxue_8/关注码同学公众号
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()
END
免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频,可加:Matongxue_8/关注码同学公众号
本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
2021-01-21 测试如何发挥更大的价值?聊聊测试左移和右移