• python 注解, 装饰器@ 详解


    目录

    1 组合数据类型注解方式

    2 自定义类注解

    3 参数是函数的注解

    4 变量注解

    5 装饰器


    python注解包含: 组合数据类型注解, 自定义类注解,变量注解,参数是函数的注解等;

            python的注解,能够让python 像java, C语言等静态类型语言一样严格,规范我们的代码,更好的实现编程;

    1 组合数据类型注解方式

    1. >>> def func(a: int, b: list):
    2. ... ...
    3. >>> def func(a: int, b: list[int]):
    4. ... ...
    5. >>> from typing import * # 包含List类型
    6. >>> def func(a: int, b: List[int]):
    7. ... ...

    2 自定义类注解

    1. >>> class Node:
    2. def __init__(self):
    3. self.val = None
    4. self.left = None
    5. >>> def func(node: Node) # 直接写下类名,是Node类型

    3 参数是函数的注解

    1. >>> def func(x:int) -> float: # 表示输入类型为int,返回类型为float
    2. return float(x**2)
    3. >>> def func2(f: callable[[int], float])
    4. ...
    5. >>> func2(func) # 调用

    4 变量注解

    >>> a: int = 15 # 说明定义的变量a是int类型

    5 装饰器

            python中所有的东西都是object;

            因此python中构建的函数,本身也是一个对象, 构建函数,也可以理解为构建了一个变量,变量包含了一个函数对象(Callable,使用加()的方式调用);

            1 函数可以被当做普通的参数被传进其他函数; 如下面的例子:

             2 函数也可以称为一个函数的返回值; 如下面的例子:

                    函数返回的函数做什么事情,是由get_multiple_func得到的参数(argument)有关;

                            比如 double = get_multiple_func(2),就是返回一个函数,函数对象赋值给变量double,这个变量是可以被调用的,也就是Callable; 因此会得到下图右侧的输出;

             3 加入@函数名 后,如下面的例子:

            @dec

            def double(x):

                    return x*2

            就完全等价于:

                    double = dec(double), 也就是dec调用double, 返回一个函数/其他对象给double;

            然后将double输出;

             4 加入*arg 和 **kwargs后, 下面例子:

            *arg 和 **kwargs就相当于允许变长的函数参数:

                    下面 第一个装饰器: 相当于 my_func = timeit(my_func) , 运行之后是 my_func = wrapper(x) -- 相当于 先把my_func 作为参数传入装饰器,然后函数再和(x)调用函数;

                    第二个装饰器部分:  add = timeit(add), 运行之后是: add = wrapper(x,y)

                    下面调用输出部分,相当于 add = warpper(2,3); wrapper函数内部的语句 ret = f(*arg, **kwargs),相当于 ret = add(2,3), 然后得到 ret = 5, 然后先输出花费时间,再返回ret,输出计算结果;

             5 带参数的装饰器,如下面的例子

            @timeit(1000)

            def double(x):

                    return x*2

            完全等价于: double = timeit(1000)(double)

    也就是先调用 timeit(1000),得到返回的函数,然后再调用返回的函数;

                    因此下面函数的运行过程是: double = timeit(1000)(double) -> double = inner(double) -> double = wrapper(2)

     wrapper函数内 ret = f(*arg, **kwargs) 相当于 ret = double(2), 然后输出时间;

     注解部分参考视频:【python技巧005】注解不是注释!彻底弄懂所有的"注解"怎么写_哔哩哔哩_bilibili

    装饰器部分参考视频:【python】装饰器超详细教学,用尽毕生所学给你解释清楚,以后再也不迷茫了!_哔哩哔哩_bilibili

  • 相关阅读:
    D8调试工具——jsvu的使用细则
    pytorch入门
    HarmonyOS音频开发指导:使用AVPlayer开发音频播放功能
    Java I/O(3):NIO中的Buffer
    【1106】记录
    瑞吉外卖项目 基于spring Boot+mybatis-plus开发 超详细笔记,有源码链接
    计算机毕业设计Java汉服配饰销售系统(源码+系统+mysql数据库+lw文档)
    微服务:Sentinel篇
    okhttp关于header修改
    密码学学习
  • 原文地址:https://blog.csdn.net/qq_40671063/article/details/126908633