[扩展阅读] Python 函数修饰符(装饰器)的使用

来自小甲鱼零基础入门学习Python

1.  修饰符的来源

借用一个博客上的一段叙述:修饰符是一个很著名的设计模式,经常被用于有切面需求的场景,较为经典的有插入日志、性能测试、事务处理等。
修饰符是解决这类问题的绝佳设计,有了修饰符,我们就可以抽离出大量函数中与函数功能本身无关的雷同代码并继续重用。概括的讲,修饰符的作用就是为已经存在的对象添加额外的功能。
如下:

 

import time
 
def timeslong(func):
    start = time.clock()
    print("It's time starting ! ")
    func()
    print("It's time ending ! ")
    end = time.clock()
    return "It's used : %s ." % (end - start)

 

AttributeError: module 'time' has no attribute 'clock',原因是Python3.8不支持clock了,替换成time.perf_count(),修改后:

import time

def timeslong(func):
    start = time.perf_counter()
    print("It's time starting!")
    func()
    print("It's time ending!")
    end = time.perf_counter()
    return "It's used : %s ." % (end - start)

def func():
    print('Hello, world')
    print('Hello, world')
    print('Hello, world')


a = timeslong(func)
print(a)

结果:

>>> runfile('D:/python练习/小甲鱼课堂练习/扩展阅读-修饰器.py', wdir='D:/python练习/小甲鱼课堂练习')
It's time starting!
Hello, world
Hello, world
Hello, world
It's time ending!
It's used : 0.0006813999999999432 .

 

上面的程序中,定义了一个函数,对另外一个对象的运行时间进行计算,如果采用通常的方式需要将 func() 重新在 timeslong 中重新写一遍。意思就是在timeslong()这个括号内修改参数。为了简化这种操作,便提出了修饰符的概念。

 1 import time
 2 
 3 
 4 def timeslong(func):
 5     def call():
 6         start = time.perf_counter()
 7         print("It's time starting ! ")
 8         func()
 9         print("It's time ending ! ")
10         end = time.perf_counter()
11         return "It's used : %s ." % (end - start)
12 
13     return call
14 
15 
16 @timeslong
17 def f():
18     y = 0
19     for i in range(10):
20         y = y + i + 1
21         print(y)
22     return y
23 
24 
25 print(f())

结果:

runfile('D:/python练习/小甲鱼课堂练习/扩展阅读-修饰器.py', wdir='D:/python练习/小甲鱼课堂练习')
It's time starting ! 
1
3
6
10
15
21
28
36
45
55
It's time ending ! 
It's used : 0.00013719999999994847 .

这样出现便不用在 函数内部再进行嵌入函数,通过 @timeslong 对其进行修饰达到目的,是整个代码美观,而且少些部分代码。

修饰符也可以通过来进行使用,共享该类,如下为一个实例:

import time
class timeslong(object):
    def __init__(self,func):
        self.f = func
    def __call__(self):
        start = time.perf_counter()
        print("It's time starting ! ")
        self.f()
        print("It's time ending ! ")
        end = time.perf_counter()
        return "It's used : %s ." % (end - start)

@timeslong
def f():
    y = 0
    for i in range(10):
        y = y + i + 1
        print(y)
    return y

print(f())

结果:

runfile('D:/python练习/小甲鱼课堂练习/扩展阅读-修饰器.py', wdir='D:/python练习/小甲鱼课堂练习')
It's time starting ! 
1
3
6
10
15
21
28
36
45
55
It's time ending ! 
It's used : 0.00010909999999997311 .
类 结果

2.  Python内置的修饰符

内置的修饰符有三个,分别是 staticmethodclassmethodproperty,作用分别是把类中定义的实例方法变成静态方法、类方法和类属性。由于模块里可以定义函数,所以静态方法和类方法的用处并不是太多。

classmethod 修饰过后,print_hello() 就变成了类方法,可以直接通过 Hello.print_hello() 调用,而无需绑定实例对象了。

posted @ 2020-07-22 15:40  廖海清  阅读(344)  评论(0编辑  收藏  举报