美文网首页
闭包和装饰器

闭包和装饰器

作者: 楚糖的糖 | 来源:发表于2020-06-23 14:13 被阅读0次

在一个函数内部再定义一个函数,并且这个函数用到了外面的函数的变量,那么将这个函数以及用到的一些变量称之为闭包


def test():

    print("---1---")

    test()

    test

注意:一个是调用函数,一个是返回对象的引用,也就是函数的首地址。

test表示是函数,引用信息,引用对象,首地址。

test()表示执行test函数

简单版的闭包

def test(number1):

        print("----1--")

        def test_in():

                print("----test_in---")

                print(number1 +100)

        print("---3-----")

        return test_in

res=test(100)    #相当于res=test_in

print("*"*20)  #相当于 print(test_in)

res()   #相当于test_in

结果是---1---

---3----

**************

---test_in-----

200

#####res(1) 相当于 test_in(1)也就是你在调用test_in(1)的时候传递参数了,但是在定义这个函数的时候确没有定义形参,会报错


def test(number1):

print("----1--")

        def test_in(number2):

                print("----2---")

                print(number1 +number2)

print("---3---")

        return test_in

res=test(100)   

print("*"*20) 

res(1)   

res(100)

结果是:----1--

---3----

***********

------2-------

101

------2-----

200


装饰器

生成器是用来生成东西的,装饰器是用来装饰东西的。

重写:

def test1():

        print("----1-----")

def test1():

        print("-----2----")

test1()

结果是:----2-----


lambda函数

def foo():

        print("foo")

foo = lambda x:x+1

foo(2)

结果是3


语法糖

def w1(func):

        def inner():

                print("验证权限")

                func()

        return inner

def f1():

        print("===f1")

def f2():

        print("===f2")

A=w1(f1)

A()

运行结果

验证权限

===f1


def w1(func):

        def inner("验证权限")

                func()

        return inner

@w1

def f1():

        print("===f1")

def f2():

        print("===f2")

f1()

结果是

验证权限

===f1


def login(func): 

         def inner(): 

                 username = input("name")

                 password = input("pwd")    

                 if username=="1" and password=="1": 

                         print("登陆成功") 

                         func() 

                 else: 

                         print("登陆失败")

        return inner()

 @login 

def f1():

         print("客户是f1")

 @login 

def f2():

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

f1() 

f2()

结果是##########################

name1

pwd1

登陆成功

客户是f1


加粗与倾斜共同装饰:

装饰器的功能:

引入日志,函数执行时间统计,执行函数前预备处理,执行函数后清楚处理,权限校验等场景

# 加粗装饰器

def A(fn):

        def aa():

                return"<b>"+fn()+"</b>"

        return aa

def B(fn):

        def aa():

                return "<i>"+fn()+"</i>"

        return aa

@A

def test1():

        return"hello1"

@B

def test2():

        return"hello2"

@A

@B

def test3():

        return "hello3"

print(test1())

print(test2())

print(test3())

结果是

<b>hello1</b>

<i>hello2</i>

<b><i>hello3</i></b>


装饰器执行的时间分析

def A(func):

        print("装饰中")

        def inner():

                print("验证")

                func()

        return inner

@A

def aa():

        print("----f1")

# aa()

aa被注释掉的时候,打印装饰中,

aa未被注释的情况下打印      

装饰中

验证

----f1


def A(func):

        print("----f1")

                def inner():

                        print("inner1")

                        func()

                        print("inner2")

        print("-----f2")

        return inner

# def test():

#         print("test")

# test = A(test)

# test()

#使用装饰器的形式

@A

def test():

        print("-----test")

test()

结果是:

装饰中

----f1

-----f2

inner1

-----test

inner2

想要传递参数的话:

test(11,22),

需要同时def inner(a,b):和func(a,b),

def test(a,b)

print("----%d,%d"%(a,b))

不然会报错


# 装饰器对带有返回值的函数进行装饰

def test():

    print("--test--")

    return "haha"

res = test()

print("%s"%res)

 结果是:

--test--

haha


def func(ff):

        print("---func--1")

                def func_in():

                        print("in 1")

                        ff()

                        print("in 2")

                        print("---func--2")

                  return func_in

@func

def test():

        print("---test---")

        return "hahah"

res = test()

print("test=%s"%res)

结果是:

---func--1

---func--2

in 1

---test---

in 2

test=None

/////////需要加上

xxx=ff()

return xxx


相关文章

  • python 高级 13闭包 装饰器

    闭包和装饰器 1.8 闭包和装饰器 学习目标 1. 能够说出闭包的定义形式 2. 能够说出装饰器的实现形式 ...

  • Python装饰器-专题笔记

    学会装饰器,Python更进阶 函数作用域到闭包到装饰器讲解,及闭包和装饰器的运用。 [√] 慕课网Meshare...

  • Python的自定义超时机制——装饰器的妙用

    装饰器 关于装饰器的入门,可以参考这篇文章:12步轻松搞定python装饰器简单来说,装饰器其实就是一个闭包(闭包...

  • python装饰器

    学习了闭包的概念之后,再来学习装饰器就简单很多。装饰器就是闭包的一个应用 代码举例 但是装饰器在使用时分加载态和调...

  • Python简明教程第15节:装饰器参数和装饰器解除

    装饰器参数 上面介绍的装饰器中的闭包和被装饰的函数的参数是相同的。 其实只要保证闭包和被装饰的函数中的参数保持一致...

  • Python-闭包和修饰器

    作用域 闭包 code: 装饰器 code: 装饰器案例 code:

  • 闭包和装饰器

    一、闭包 什么是闭包?在了解这个概念之前,我们先来看一个小例子。 上面的例子中,我们看到有一个外部函数,内部定义了...

  • 闭包和装饰器

    在一个函数内部再定义一个函数,并且这个函数用到了外面的函数的变量,那么将这个函数以及用到的一些变量称之为闭包 de...

  • 闭包和装饰器

    闭包 之前一直不明白闭包的定义-内层函数引用了外层函数的变量(包括它的参数)就构成了闭包。我觉得也没什么了不起的,...

  • 闭包和装饰器

    什么是闭包? 各种专业文献的闭包定义都非常抽象,我的理解是:闭包就是能够读取其他函数内部变量的函数。 """ 使用...

网友评论

      本文标题:闭包和装饰器

      本文链接:https://www.haomeiwen.com/subject/fpqfiftx.html