zoukankan      html  css  js  c++  java
  • 十一. Python基础(11)—补充: 作用域 & 装饰器

    十一. Python基础(11)—补充: 作用域 & 装饰器

    1 ● Python的作用域补遗

    C/C++等语言中, if语句等控制结构(control structure)产生新的作用域:

    void main()

    {

        //int num = 10;

        if (2 > 1){

            int num = 100;

        }

        printf("%d", num);

        getchar();

    }

    //在上面的案例中, printf("%d", num);中的num 会被警示未被声明.

    但是, Python, if语句等控制结构(control structure)不会产生新的作用域, 因此, 下面的程序在Python中是可以执行的.

    if 2 > 1:

        num = 100

    print(num) # 100

    Python, 只用三种语句块(block):

    A block is a piece of Python program text that is executed as a unit. The following are blocks: a module, a function body, and a class definition.

    Python lacks declarations and allows name binding operations to occur anywhere within a code block.

     

    2 ● 带参数的装饰器

    def outer(flag):

        def wrapper(func): # wrapper是装饰器的名字

            def inner(*args, **kwargs):

                if flag:

                    print("被装饰的函数执行之前你要做的事.")

                ret = func(*args, **kwargs) # 被装饰的函数, 返回值为None也写出来

                if flag:

                    print("被装饰的函数执行之后你要做的事.")

                return ret

            return inner

        return wrapper

     

    @outer(False) # 传True表示不执行装饰器, 传False表示不执行装饰器

    def welcome(name): # welcome是被装饰的函数

        print('Welcome:%s!'%name)

     

    @outer(False) # 传True表示不执行装饰器, 传False表示不执行装饰器

    def home(): # home是被装饰的函数

        print('欢迎来到home页!')

     

    welcome("Arroz")

    print("===============================")

    home()

    Welcome:Arroz!

    ===============================

    欢迎来到home页!

     

    3 ● 用多个装饰器装饰一个函数

    def wrapper1(func):

        def inner():

            print("wrapper1, before func")

            func()

            print("wrapper1, after func")

        return inner

     

    def wrapper2(func):

        def inner():

            print("wrapper2, before func")

            func()

            print("wrapper2, after func")

        return inner

     

    @wrapper2

    @wrapper1

    def home():

        print('欢迎来到home页!')

     

    home()

    '''

    wrapper2, before func

    wrapper1, before func

    欢迎来到home页!

    wrapper1, after func

    wrapper2, after func

    '''

    关键是要把握函数扩展功能的执行顺序

     

  • 相关阅读:
    golang学习笔记 ---接口
    golang学习笔记 --类与方法
    golang学习笔记--面向对象编程
    golang学习笔记---错误处理
    golang学习笔记---defer[延迟函数]
    golang学习笔记--闭包
    golang学习笔记---函数
    SSD技术扫盲之:什么是NVMe? NVMe SSD有什么特点?
    云原生存储系列文章:云原生应用的基石
    发财树的养殖方法
  • 原文地址:https://www.cnblogs.com/ArrozZhu/p/8393687.html
Copyright © 2011-2022 走看看