• Python 学习笔记9(装饰器,decorator)


    31 装饰器

    装饰器可以对一个函数、方法或者类进行加工,是一种高级的python语法。

    • 装饰函数

    1. 接收一个可调用对象作为输入参数,并返回一个新的可调用对象.
    2. 把函数传递给装饰器,然后增加新的功能,返回一个新的函数重赋值给原函数
    3. 语法:

    def decorator1...  #  定义装饰器

    @decorator1        #  定义函数前,@装饰器

    def function1        # 定义要加工的函数

    例子:

    def mydecorator(myfunction):
        def new_myfunction(a,b):
            print("modify myfunction:")   # 1
            return myfunction(a,b)
        return new_myfunction
    
    
    @mydecorator
    def myfunction(x,y):
        print("old myfunction")            #2
        return x*y
    
    print(myfunction(6,7))
    

    顺序: 先执行装饰器里面的语句1,再执行原函数的语句2。

    • 含参的装饰器

    在上面的例子中,@mydecorator默认后面的函数是它的唯一参数;

    实际上,装饰器也可以含有其它参数,如@mydecorator(a)

    •  装饰类

    一个装饰器可以接收一个类,并返回一个类,从而起到加工类的效果。

    例子:

    def mydecorator(myclass):
        class newClass:
            def __init__(self,age):
                self.display_time=0
                self.wrapped=myclass(age)                               #把原类赋值给新类
            def display(self):
                self.display_time+=1
                print("this is ",self.display_time,"th display time")   #1
                self.wrapped.display()                                  # 调用原类的函数
        return newClass
    
    @mydecorator
    class Bird:
        def __init__(self,age):
            self.age=age
        def display(self):
            print("My age is ", self.age)                              #2
    
    eagleLord=Bird(5)
    for i in range(4):
        eagleLord.display()
    

    顺序与装饰函数类似。先装饰类1,后原类2。

  • 相关阅读:
    形象的理解Strong和Weak
    iOS开发中常见的一些异常
    离屏渲染
    如何从海量IP中提取访问最多的10个IP
    XJOI3363 树3/Codeforces 682C Alyona and the Tree(dfs)
    XJOI 3578 排列交换/AtCoder beginner contest 097D equal (并查集)
    XJOI 3605 考完吃糖(DAG图dfs)
    POJ 3660 Cow Contest(传递闭包)
    XJOI 3601 技能(贪心+二分)
    51nod 1421 最大MOD值(高妙的调和级数复杂度)
  • 原文地址:https://www.cnblogs.com/skyEva/p/5477564.html
Copyright © 2020-2023  润新知