欢迎访问宙启技术站
智能推送

Python中的装饰器函数介绍及应用

发布时间:2023-06-03 06:09:02

装饰器函数是Python中一种高级的操作,它可以让我们在不改变原函数代码的情况下,对其进行增强。在今天的文章中,我们将介绍装饰器函数的基本概念,以及在Python中如何使用它。

一、什么是装饰器函数

装饰器函数本身也是一个函数,它可以接收其他函数作为参数,并且在不改变参数函数代码的情况下,为其添加一些额外的功能,例如:记录函数运行时间、缓存函数计算结果等等。装饰器函数的本质就是返回一个函数对象,这个返回的函数实现了对原函数的增强操作。

二、装饰器函数的应用

1、函数运行时间计算

我们经常需要计算函数运行的时间,装饰器函数可以让我们在不修改函数代码的情况下,为其添加运行时间计算的功能。

import time

def timer(func):
    def wrapper(*args, **kwargs):
        start_time = time.time()
        result = func(*args, **kwargs)
        end_time = time.time()
        print("运行时间:%.6f秒" % (end_time - start_time))
        return result
    return wrapper

@timer
def test_func():
    time.sleep(3)

test_func()

2、函数计算结果缓存

当我们编写函数时,如果这个函数需要执行大量的计算,每次调用这个函数都需要执行一次计算,这将很浪费时间。使用装饰器函数,可以将函数的计算结果缓存起来,当下次调用函数时,如果输入参数没有变化,则直接返回缓存结果。

def memoize(func):
    caches = {}
    def wrapper(*args):
        if args in caches:
            return caches[args]
        else:
            result = func(*args)
            caches[args] = result
            return result
    return wrapper

@memoize
def fibonacci(n):
  if n<=1:
    return n
  else:
    return fibonacci(n-1)+fibonacci(n-2)

print(fibonacci(40)) # 102334155

三、常见的装饰器函数

在Python中,已经有很多常用的装饰器函数,下面是一些常见的装饰器函数:

1、@staticmethod:将一个方法转换为静态方法。静态方法不需要实例化对象就可以使用。

class Test:
    @staticmethod
    def add(a, b):
        return a + b

print(Test.add(1, 2)) # 3

2、@classmethod:将一个方法转换为类方法。类方法 个参数总是类本身,不需要实例化对象。

class Test:
    count = 0

    @classmethod
    def add_count(cls):
        cls.count += 1
        return cls.count

print(Test.add_count()) # 1
print(Test.add_count()) # 2

3、@property:将一个方法转换成属性。当我们需要用方法来获取一个属性时,可以使用@property装饰器。

class Test:
    def __init__(self, age):
        self._age = age

    @property
    def age(self):
        return self._age

t = Test(18)
print(t.age) # 18

四、总结

本文介绍了Python中装饰器函数的基本概念,以及它在Python中的应用,并且介绍了一些常见的装饰器函数。装饰器函数是Python中一种非常高级的功能,掌握装饰器函数的使用可以让我们更好的编写Python程序。