Python中常见的装饰器有函数装饰器、类装饰器、属性装饰器和方

2023-03-30  本文已影响0人  DD丿

1.函数装饰器

函数装饰器是最常见的装饰器,它的作用是在不改变原函数代码的情况下,为函数添加一些额外的功能,比如日志记录、性能分析等。

例如,下面的代码实现了一个简单的函数装饰器,它记录了函数的执行时间:

import time

def timer(func):

    def wrapper(*args, **kwargs):

        start_time= time.time()

        result= func(*args, **kwargs)

        end_time= time.time()

        print(f"执行时间:{end_time- start_time:.5f}秒")

        return result

return wrapper

@timer

def my_function():

    time.sleep(1)

    print("函数执行完毕")

my_function()

输出:

函数执行完毕执行时间:1.00044秒

2.类装饰器

类装饰器是用来装饰类的,它的作用是在不改变原类定义的情况下,为类添加一些额外的功能,比如给类添加属性、修改类方法等。

例如,下面的代码实现了一个简单的类装饰器,它为类添加了一个名为name的属性:

def add_name(cls):

    cls.name= "MyClass"

    return cls

@add_name

class MyClass:

    pass

print(MyClass.name)

输出:

MyClass

3.属性装饰器

属性装饰器是用来装饰类的属性的,它的作用是在不改变原属性定义的情况下,为属性添加一些额外的功能,比如类型检查、缓存等。

例如,下面的代码实现了一个简单的属性装饰器,它为一个类的属性添加了类型检查:

def type_check(attr_type):

    def decorator(func):

        def wrapper(self, value):

            if not isinstance(value, attr_type):

                raise ValueError(f"属性值必须是{attr_type}类型")

            func(self, value)

        return wrapper

return decorator

class MyClass:

    @type_check(int)

    def set_value(self, value):

        self._value= value

my_object= MyClass()

my_object.set_value(10)

my_object.set_value("Hello")  # 抛出异常

输出:

ValueError: 属性值必须是<class 'int'>类型

4.方法装饰器

方法装饰器是用来装饰类的方法的,它的作用是在不改变原方法定义的情况下,为方法添加一些额外的功能,比如权限检查、缓存等。

例如,下面的代码实现了一个简单的方法装饰器,它为一个类的方法添加了缓存:

def cache(func):

    cache_dict= {}

    def wrapper(self, *args):

        key= (func.__name__, args)

        if keyin cache_dict:

            print("从缓存中获取数据")

            return cache_dict[key]

        else:

            result= func(self, *args)

            cache_dict[key] = result

print("计算结果并缓存")

            return result

return wrapper

class MyClass:

    @cache

    def get_value(self, x):

        return x ** 2

my_object= MyClass()

print(my_object.get_value(2))

print(my_object.get_value(2))

输出:

计算结果并缓存

4

从缓存中获取数据

4

上一篇 下一篇

猜你喜欢

热点阅读