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

  • 相关阅读:
    Python学习——模块的基本知识
    Python学习-软件目录结构规范
    路径追踪的理论与实现:复合重要性采样
    路径追踪的理论与实现:渲染方程
    记一个C++随机数导致的bug
    Gamma矫正的原理和实现
    聊一聊Python的sort函数
    BVH树的构建与遍历
    Cocos动画系统
    Cocos事件分发系统
  • 原文地址:https://www.cnblogs.com/menkeyi/p/6725098.html
Copyright © 2011-2022 走看看