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

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

装饰器

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

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()

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值