Python特性_装饰器

python装饰器

K有话说:装饰器就是装饰一定功能模块的器具,不想修改函数的调用方式,但是想在原来的函数上添加功能

设计装饰器的目的是:

  1. 软件已经设计完成,想给某些功能模块添加功能,直接改这个模块会牵一发动全身(包括参数、返回值都不能改,直接改会出现预想不到的结果,尤其更改基础模块,且在多人开发的环境下,都要调用这个模块)

  2. 软件开发过程中,想给所有模块添加指定的功能,比方说添加每个模块的运行时间,每个模块都改,工作量过大,且费力出错率高。

  3.对于一些重复率较高的功能模块,且通用性较强的模块,可以写成装饰器

装饰器的原则:

  1. 不改变函数的调用方式

  2.不改变函数的返回参数

例子:

1. 不带参数装饰器的例子

需求:给一个模块加上时间统计功能

原先功能模块

 

def demorange(inta):
    for i in range(inta):
        import time
        time.sleep(0.2)
        print(i)

 

需要在上述功能模块添加所消耗时间统计,并将消耗时间输出

完整代码

def ansytime(fun):
    def swap(*args, **kwargs):
        import time
        kstime = time.time()
        fun(*args, **kwargs)
        endtime = time.time()
        print(fun.__name__, "函数所消耗的时间为", endtime - kstime)
    return swap

@ansytime
def demorange(inta):
    for i in range(inta):
        import time
        time.sleep(0.2)
        print(i)

demorange(5)

 

2. 带参数的装饰器

需求:每个功能模块需要加上开发人的信息,方便管理,由于开发人员不唯一,所以需要传递开发人员的信息,在上面代码做更改

完整代码

def author_time(arv):
    def ansytime(fun):
        def swap(*args, **kwargs):
            import time
            kstime = time.time()
            fun(*args, **kwargs)
            endtime = time.time()
            print(fun.__name__, "函数所消耗的时间为", endtime - kstime)
        return swap
    print('开发人员信息:', arv)
    return ansytime

@author_time("kimy")
def demorange(inta):
    for i in range(inta):
        import time
        time.sleep(0.2)
        print(i)

demorange(5)

 Python常用的装饰器

1. staticmethod

用来修饰类的装饰器,使用该方法可以直接用雷鸣来访问,如: class.fun()

class DemoClass(object):
    def __init__(self):
        pass

    @staticmethod
    def cfun(stra):
        print(stra)

    @staticmethod
    def cfunb():
        print("demo")

DemoClass.cfun("hello")
DemoClass.cfunb()

2.classmethod
和staticmehod类似,classmethod会将class传入被修饰的方法中。

class DemoClass(object):
    def __init__(self):
        self.name = "kimy"

    @staticmethod
    def cfun(stra):
        print(stra)

    @classmethod
    def cfunb(cls):
        print(cls().name)


DemoClass.cfun("hello")
DemoClass.cfunb()

3.property

讲方法编程类的属性来表示

class DemoClass(object):
    def __init__(self):
        self.name = "kimy"

    @property
    def cfun(self):
        for i in range(6):
            print(self.name, ":", i)

DemoClass().cfun

 

posted on 2020-03-04 22:22  andy_family  阅读(301)  评论(0)    收藏  举报