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


    每天进步一点点,关注我们哦,每天分享测试技术文章

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

    码同学公众号:自动化软件测试,领取资料可加:magetest

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

    装饰器

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

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

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

    1.python装饰器原理基础

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

    2.装饰器的语法

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

    ①@符号调用装饰器

    ②定义被装饰的方法

    范例如下:

    @装饰器名字

    定义被装饰的函数

    @logger
    def func():
    pass

    3.一般用来做什么?

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

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

    免费领取码同学软件测试课程笔记+超多学习资料+完整视频+面试题,可加微信:magetest

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

    免费领取码同学软件测试课程笔记+超多学习资料+学习完整视频 ☞ 可加:magetest/关注码同学公众号:自动化软件测试

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

  • 相关阅读:
    css 文本超过指定行数,显示省略号
    CSS 使radio和checkbox框,和文字对齐平行
    C# 使用InputStream接收 解析表单参数
    CSS 控制文本超出宽度,显示省略号
    C# 将http在线文件,保存到服务器指定位置
    C# Get请求
    C# POST请求
    js 使用XMLHttpRequest 上传文件,显示进度条
    js 验证字符长度,一个中文2个字符,英文和数字为1个字符
    iOS Carthage集成SnapKit
  • 原文地址:https://www.cnblogs.com/testfan2019/p/16415195.html
Copyright © 2020-2023  润新知