十一. 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

'''

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

 

转载于:https://www.cnblogs.com/ArrozZhu/p/8393687.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值