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

    '''

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

     

  • 相关阅读:
    js实现好看的图案 加勒比海盗(php拍黄片)
    网站优化的几点 下
    php算法 快速排序 选择算法 冒泡算法
    javascript中null和undefined的区别
    tp3 上传图片出现上传根目录不存在!请尝试手动创建:./Public/Uploads/ 错误解决思路
    网站优化的几点 上
    tp5框架 报错非法请求:admin/index/index
    通过response向服务器用Io流写入图片
    解决客户端向服务器写中文时乱码问题
    setInterval()设置页面5,4,3,2,1秒后跳转
  • 原文地址:https://www.cnblogs.com/ArrozZhu/p/8393687.html
Copyright © 2011-2022 走看看