python 注解, 装饰器@ 详解

目录

1 组合数据类型注解方式

2 自定义类注解

3 参数是函数的注解

4 变量注解

5 装饰器


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

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

1 组合数据类型注解方式

>>> def func(a: int, b: list):
...     ...

>>> def func(a: int, b: list[int]):
...     ...

>>> from typing import * # 包含List类型


>>> def func(a: int, b: List[int]):
...     ...

2 自定义类注解

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

3 参数是函数的注解

>>> def func(x:int) -> float: # 表示输入类型为int,返回类型为float
        return float(x**2)

>>> def func2(f: callable[[int], float])
        ...

>>> func2(func) # 调用

4 变量注解

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

5 装饰器

        python中所有的东西都是object;

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

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

python 注解, 装饰器@ 详解_第1张图片

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

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

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

python 注解, 装饰器@ 详解_第2张图片

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

        @dec

        def double(x):

                return x*2

        就完全等价于:

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

        然后将double输出;

python 注解, 装饰器@ 详解_第3张图片

         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,输出计算结果;

python 注解, 装饰器@ 详解_第4张图片

         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 注解, 装饰器@ 详解_第5张图片

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

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

你可能感兴趣的:(编程,python)