面试官:不懂Python装饰器的人直接拒绝 我:这..

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

学习资源分享

最后感谢每一个认真阅读我文章的人,看着粉丝一路的上涨和关注,礼尚往来总是要有的,虽然不是什么很值钱的东西,如果你用得到的话可以直接拿走

这些资料,对于想从事【软件测试】的朋友来说应该是最全面最完整的备战仓库,这个仓库也陪伴我走过了最艰难的路程,希望也能帮助到你!加入我们下方交流群就可以免费获取了,希望对大家有所帮助…….

猜你喜欢

转载自blog.csdn.net/weixin_54696666/article/details/125235159
今日推荐