day11 装饰器初识

本节课主要内容

1函数名的运用 第一类对象

2闭包

3装饰器初识

一 函数名的运用:

函数名是一个变量,但它是一个特殊的变量,与括号配合执行函数的变量

1函数名的内存地址

# def  func():
#     print("呵呵")
# print(func())#返回none 是因为没加返回值
# print(func) #返回的是func这个函数的内存地址

2函数名可以赋值给其他变量

# def func():
#     print("呵呵")
# a=func #吧函数当成一个变量赋值给另一个变量
# a()   #函数调用func()

3 函数名可以当做容器量的元素

# def func1():
#     print("呵呵")
# def func2():
#     print("嘻嘻")
# def func3():
#     print("嘿嘿")
# def func4():
#     print("嗯嗯")
# lst=[func1,func2,func3]  #吧每个函数的名字装在一个列表里
# for i in lst:  #循环这个列表
#     i()     #启用列表每个函数名

4 函数名可以当做函数的参数

# def func2(fn):
#     print("我是func2")
#     fn()  #执行传过来的fn
#     print("我是func2")
# func2(func)  #吧函数func当成参数传递给func2的参数fn

5函数名可以作为函数的返回值

  

def func1():
    print("这是函数1")
    def func2():
        print("这里是函数2")
    print("只是函数1")
    return func2  #执行函数3返回的是fun2
fn=func1()    #fn=func1意思是  fun2=fun1
fn()        #执行fun2

二  闭包

什么是闭包?闭包就是内层函数引用外层函数(不能是全局函数) 我们可以用_closure_来检测cell是闭包 none不是

def func1():
    name="alex"
    def func2():
        print(name)
    func2()
    print(func2.__closure__)  #返回的是cell
func1()

  如何在函数外边调用内部函数呢?

def func1():
    name="alex"
    def inner():
        print(name)
    return inner
fn=func1()  #访问外部函数获取到内部函数的函数地址
fn()  #访问内部函数

   由它我们可以引出闭包的好处.  由于我们在外界可以访问内部函数. 那这个时候内部函 数访问的时间和时机就不⼀一定了了, 因为在外部, 我可以选择在任意的时间去访问内部函数. 这 个时候. 想⼀一想. 我们之前说过, 如果⼀一个函数执⾏行行完毕. 则这个函数中的变量量以及局部命名 空间中的内容都将会被销毁.  在闭包中. 如果变量量被销毁了了. 那内部函数将不能正常执⾏行行. 所 以. python规定. 如果你在内部函数中访问了了外层函数中的变量量. 那么这个变量量将不会消亡. 将会常驻在内存中. 也就是说. 使⽤用闭包, 可以保证外层函数中的变量量在内存中常驻.

三 装饰器初识

  设计原则:开闭原则,又被称为开放封闭原则.你的代码对功能的扩展是开放的,你的程序对修改源代码是封闭的,这样的软件设计思路可以更好的维护和开发

def fun(func2):
    def inner(*args,**kwargs):
        print("每次执行被装饰函数之前都得先经过这里")
        ret=func2(*args,**kwargs)
        print("每次执行完被装饰函数之后都得先经过这里")
        return  ret
    return inner
@fun
def fun1():
    print("执行中")

  

posted @ 2018-06-14 19:10  山东张铭恩  阅读(130)  评论(0编辑  收藏  举报