不学会装饰器,面试不敢说自己会Python

 我来答
世纪网络17
2022-07-18 · TA获得超过5882个赞
知道小有建树答主
回答量:2426
采纳率:100%
帮助的人:134万
展开全部

本文章出自【 码同学软件测试 】

码同学公众号:自动化软件测试

码同学抖音号: 小码哥聊软件测试

装饰器

Python的装饰器 是面试常被问到的问题之一,如果你的简历里描述 会Python .那么大概率会被问到.

那么我们应该怎么回答这个问题呢?

这里我从几个角度来解释装饰器的作用,大家可以挑选符合自己的说法


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


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

①@符号调用装饰器

②定义被装饰的方法

范例如下:

@装饰器名字

定义被装饰的函数

@logger
def func():
pass


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

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


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

免费领取 码同学软件测试 课程笔记+超多学习资料+完整视频+最新面试题,可以 转发文章 + 私信「码同学666」获取资料哦

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


#!/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

本文著作权归作者所有,任何形式的转载都请联系作者获得授权并注明出处。

已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式