zoukankan      html  css  js  c++  java
  • 装饰器(入门)

    #-*- coding:utf-8 -*-
    #开放封闭原则(面向对象),尽量不要修改函数里面的内容(函数可能会被很多方法调用),尽量在外部处理。
    #装饰器可意在函数之前或者函数返回之后调用
    
    #装饰器
    def s1(func):
        def inner():
            print("hello")
            r =func()
            print("word")
    
            return r
        return inner
    @s1
    def f1():
        print("1")
    
    
    def f2():
        print("2")
    
    def f3():
        print("3")
    
    def f4():
        print("4")
    
    
    f1()
    f2()
    f3()
    f4()
    

    结果:

    hello
    1
    word
    2
    3
    4

    解析原理:

    def s1(func):
        def inner():
            print("hello")
            r =func()
            print("word")
    
            return r
        return inner
    
    #@执行s1函数,并将f1函数的名字当参数传递
    #2 将s1的返回值inner赋值给f1,等同于f1=inner 
    #3inner中函数过程就很简单了,r执行的就是f1函数,最后返回r的结果
    @s1
    def f1():
        print("1")
    #将原函数封装在一个新的函数里面,主要就是将变量的指针指向了一个新的值
    多个装饰器代码:

    def
    s2(func): def inner1(): print("11111") r =func() print("22222") return r return inner def s1(func): def inner(): print("hello") r =func() print("word") return r return inner @s2 @s1 def f1(): print("1")

     结果:

    11111
    hello
    1
    word
    22222
    2
    3
    4

    多个装饰器的原理可以记住下个图:

     手动实现装饰器

    def s1(func):
        def inner():
            print("hello")
            r =func()
            print("word")
    
            return r
        return inner
    
    def f1():
        print("1")
    
    f1=s1(f1)  #装饰器这里就是将变指针改成新的函数指针,新函数返回相应的结果即可
    print(f1())  

     结果:

    hello
    1
    word
    None

    def s2(func):
        def inner1():
            print("11111")
            r =func()
            print("22222")
    
            return r
        return inner1
    
    def s1(func):
        def inner():
            print("hello")
            r =func()
            print("word")
    
            return r
        return inner
    
    def f1():
        print("1")
    
    f2=s2(s1(f1))  #这么写跟用@是一个意思。s2接受s1的地址,s1接受f1的地址,f2()正常调用函数
    print(f2())

    显示结果:

    11111
    hello
    1
    word
    22222
    None

  • 相关阅读:
    [主席树][学习笔记]
    [bzoj2588][ Count on a tree]
    [bzoj3524][Couriers]
    [luogu3834][可持久化线段树 1(主席树)]
    [luogu3810][bzoj3262][陌上花开]
    [树套树][学习笔记]
    [luogu4556][Vani有约会]
    [线段树合并][学习笔记]
    [hdu6183][Color it]
    [动态开点线段树][学习笔记]
  • 原文地址:https://www.cnblogs.com/menkeyi/p/6725098.html
Copyright © 2011-2022 走看看