Python的 @property装饰器和@setter装饰器和@functools.wraps(func)装饰器

本文详细介绍了Python中的@property、@setter及@deleter装饰器的使用方法,通过实例展示了如何利用这些装饰器来增强类的封装性并提供更加直观的操作方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

参考:python类方法

1. @property 装饰器

通过 @property 装饰器,可以直接通过方法名来访问方法,不需要在方法名后添加一对“()”小括号。既可以保护类的封装特性,又能让开发者可以使用 “对象.属性” 的方式操作操作类属性,除了使用 property() 函数,Python 还提供了 @property 装饰器。

例如,定义一个矩形类,并定义用 @property 修饰的方法操作类中的 area 私有属性,代码如下:

class Rect:
    def __init__(self,area):
        self.__area = area
    @property
    def area(self):
        return self.__area
rect = Rect(30)
#直接通过方法名来访问 area 方法
print("矩形的面积是:",rect.area)

运行结果为:

矩形的面积是: 30

上面使用 @property 修饰了 area() 方法,这样就使得该方法变成了 area 属性的 getter 方法。(属性aera的getter方法,名字也叫aera才行)

需要注意的是,如果类中只包含该方法,那么 area 属性将是一个只读属性。也就是说,在使用 Rect 类时,无法对 area 属性重新赋值,即运行如下代码会报错:

rect.area = 90
print("修改后的面积:",rect.area)#如果函数名和属性名相同,会报该错误

运行结果为:

Traceback (most recent call last): File
“C:\Users\mengma\Desktop\1.py”, line 10, in
rect.area = 90 AttributeError: can’t set attribute

2. @setter装饰器

而要想实现修改 area 属性的值,还需要为 area 属性添加 setter 方法,就需要用到 setter 装饰器,例如,为 Rect 类中的 area 方法添加 setter 方法,代码如下:

@area.setter
def area(self, value):
    self.__area = value

再次运行如下代码:

rect.area = 90
print("修改后的面积:",rect.area)

运行结果为:

修改后的面积: 90

这样,area 属性就有了 getter 和 setter 方法,该属性就变成了具有读写功能的属性。

3. @deleter装饰器

除此之外,还可以使用 deleter 装饰器来删除指定属性
例如,在 Rect 类中,给 area() 方法添加 deleter 方法,实现代码如下:

@area.deleter
def area(self):
    self.__area = 0

然后运行如下代码:

del rect.area
print("删除后的area值为:",rect.area)

运行结果为:

删除后的area值为: 0

4. 修饰器/装饰器

在这里插入图片描述
案例:classmethod的用法举例

class B:
    age = 10
    def __init__(self, name):
        self.name = name
    @classmethod
    def eat(cls): #普通函数
        print(cls.age)

    def sleep(self):
        print(self)

b = B("小贱人")  # 对应name属性
b.eat()

#运行结果为:10

5 案例

5.1 案例1

下面 timeit_decorator 装饰器的作用是——计算并打印被装饰函数的运行时间。

要使用它,可以按照以下步骤为要监控的函数添加装饰器。

使用示例:

  1. timeit_decorator 应用于某个函数

    • 使用 @timeit_decorator 装饰器来修饰你想要测量执行时间的函数。
    • 当该函数被调用时,装饰器会计算并打印函数的运行时间。
  2. 示例代码

import time

# 定义装饰器
def timeit_decorator(func):
    """装饰器:用于计算函数运行时间"""
    def wrapper(*args, **kwargs):
        start_time = time.time()  # 记录开始时间
        result = func(*args, **kwargs)  # 调用被装饰的函数
        end_time = time.time()  # 记录结束时间
        print(f"{func.__name__} 执行时间: {end_time - start_time:.2f}秒")  # 打印执行时间
        return result
    return wrapper

# 使用装饰器
@timeit_decorator
def example_function(n):
    """一个示例函数,模拟耗时操作"""
    total = 0
    for i in range(n):
        total += i
        time.sleep(0.01)  # 模拟耗时操作
    return total

# 调用函数
result = example_function(100)  # 将会输出函数的运行时间

输出示例:

example_function 执行时间: 1.01秒

解释:

  1. 装饰器 @timeit_decorator

    • 通过 @timeit_decorator 装饰 example_function,会自动应用装饰器的逻辑。
    • 运行该函数时,会先记录开始时间,运行完函数后记录结束时间,然后打印该函数的执行时间。
  2. 函数运行时间的输出

    • example_function 被调用时,装饰器会计算其运行时间并打印出来。

应用场景:

  • 当你想监控某些函数的执行时间时,使用这个装饰器是非常方便的。你可以将它应用于任何函数,只需在函数定义前加上 @timeit_decorator

总结:

        1. @property装饰器:修饰的函数,类内调用时函数不用带小括号——getter方法
        2. @setter 装饰器:函数名和变量名相同,可以直接修改属性——seter方法。
        3.语法

@property
def 方法名(self)
        代码块
@area.setter
def area(self, value):
        self.__area = value
@方法名.deleter
def 方法名(self):
        代码块

参考链接:
[1] Python @property装饰器详解 2022.5
[2] Python装饰器functools.wraps(func)详解 2019.6

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值