[Python面向对象编程] 属性装饰器

Posted by Chase Shen on 2022-01-24
Estimated Reading Time 4 Minutes
Words 1.1k In Total
Viewed Times

属性装饰器是Python中一个非常实用的功能,它允许您用更干净、更易读的方式定义属性的访问和设置。

Python中最常见的属性装饰器是@property,它用于将一个方法转换为属性的getter方法。此外,还有@<property_name>.setter@<property_name>.deleter装饰器,分别用于定义属性的setterdeleter方法。

@property 装饰器

获取类属性

在Python中,如果类的属性是公开的(即没有下划线前缀),则可以直接从外部获取,不一定需要@property装饰器。@property装饰器主要用于当您需要在获取属性值时执行一些额外的逻辑,比如计算一个值或者添加日志等。

  • 定义属性的getter方法:将一个类方法转换成一个属性的getter,使得可以通过属性名而不是方法名来访问值。
  • 只读属性:如果只定义getter,不定义setter,那么这个属性就是只读的。

@<property_name>.setter 装饰器

定义属性的setter方法:用于设置属性的值。

setter方法必须与一个已定义的getter方法关联。如果只有setter而没有相应的getter,Python解释器将无法识别要设置的属性。

示例:使用@propertysetter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Person:
def __init__(self, name):
self._name = name

@property
def name(self):
"""Getter for name property"""
return self._name

@name.setter
def name(self, value):
"""Setter for name property"""
if not value:
raise ValueError("Name cannot be empty")
self._name = value

# 使用
p = Person("Alice")
print(p.name) # Alice,通过getter访问
p.name = "Bob" # 通过setter设置新值
print(p.name) # Bob

在这个示例中,name属性有一个getter和一个setter。当读取p.name时,会调用getter方法。当设置p.name = "Bob"时,会调用setter方法,并执行其中的检查。

@<property_name>.deleter

定义属性的deleter方法:这个装饰器用于定义删除属性时的行为。

用途

当您使用del语句删除属性时,会调用deleter方法。这可以用于执行一些清理工作或验证逻辑。

del是Python中的一个固定关键词,用于删除对象。当您使用del语句时,Python会删除指定的变量、属性或者列表中的元素。

示例:使用@property 的 deleter

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
class Person:
def __init__(self, name):
self._name = name

@property
def name(self):
"""Getter for name property"""
return self._name

@name.setter
def name(self, value):
"""Setter for name property"""
if not value:
raise ValueError("Name cannot be empty")
self._name = value

@name.deleter
def name(self):
"""Deleter for name property"""
print("Deleting name...")
del self._name

# 使用
p = Person("Alice")
print(p.name) # 输出: Alice
del p.name # 调用deleter,输出: Deleting name...

在这个示例中,当执行del p.name时,会调用@name.deleter装饰的方法。这可以用于执行删除属性前的任何必要操作。

使用场景

  • 数据封装:提供一个接口来获取和设置属性,同时隐藏内部实现。
  • 数据验证:在setter方法中添加对值的检查,确保属性值始终保持有效和一致。
  • 计算属性:getter可以返回基于其他属性计算得到的值。

属性装饰器是Python面向对象编程的强大工具,有助于创建更清晰、更可维护的代码。

自定义getter和setter方法

您可以定义自己的gettersetter方法,然后使用property函数来创建属性。这是一种更传统的方法,与使用装饰器相比,它的语法稍微冗长一些,但功能上是等效的。

示例:使用自定义方法和property函数

1
2
3
4
5
6
7
8
9
10
11
12
13
class MyClass:
def __init__(self, value):
self._value = value

def get_value(self):
"""Custom getter method."""
return self._value

def set_value(self, new_value):
"""Custom setter method."""
self._value = new_value

value = property(get_value, set_value)

在这个示例中,get_valueset_value是自定义的gettersetter方法,然后通过property(get_value, set_value)将它们绑定到value属性。

使用属性装饰器 vs 自定义方法

  • 属性装饰器:使用@property@<property_name>.setter装饰器通常是更现代、更简洁的做法。这使得代码更易读和易写。
  • 自定义方法和property函数:这种方法在Python较早的版本中更常见,它更传统,但在功能上与属性装饰器等效。

如果您喜欢此博客或发现它对您有用,则欢迎对此发表评论。 也欢迎您共享此博客,以便更多人可以参与。 如果博客中使用的图像侵犯了您的版权,请与作者联系以将其删除。 谢谢 !