Python Property 装饰器

2025年3月17日 | 阅读 7 分钟

在本教程中,我们将学习 Python 中的 property 装饰器。之前,我们已经讨论过 Python 中的装饰器;如果您熟悉装饰器,请在继续之前阅读本教程

让我们对 property 装饰器做一个介绍。

Python @property 装饰器

让我们通过一个例子来理解它——假设我们有一个类 Employee,它有三个属性 first_name、last_namedepartment_name。我们还有一个函数 email(),它使用员工的 first_name 和 last_name 为其生成电子邮件地址。让我们看下面的代码。

示例 -

现在创建类的对象并调用 email() 函数。

输出

First Name is: Bruce
Last Name is: Banner
Full Name is: Bruce Banner
[email protected]

在上面的代码中,我们定义了三个属性 first_name、last_name 和 department_name,而 email() 是派生属性。

full_name 被声明为变量,email() 被声明为函数。当我们运行程序时,我们会得到 first_name、last_name 和 full_name。full_name 是从 first_name 和 last_name 派生出来的,所以 email 也是。现在,让我们对程序做一些更改。

将 first_name 更改为 Natasha 并打印 full_nameemail 将产生以下输出。

输出

Full Name is Bruce Banner
[email protected]

我们可以看到 first name 已经改变,email 也自动改变了。尽管 email() 是我们在需要返回 email 时调用的函数,而 first_name 在对象初始化时设置,但 full_name 并没有改变。我们可以通过为 email() 创建的 full_name 创建另一个函数来修复这个问题。

示例 -

输出

First Name is: Bruce
Last Name is: Banner
Bruce Banner
[email protected]
After changing the first name:
Natasha Banner
[email protected]

我们得到了改变的 full_name 和更新的 email,但这并不是解决这个问题的 Pythonic 方式。这时 @property 装饰器就发挥作用来解决这样的问题了。

使用 @property 装饰器

property 装饰器从指定的 getter 和 setter 返回类的属性,并将它们作为参数进行删除。我们将使用 @property 装饰器来解决这个问题。现在让我们看看上面使用 @property 装饰器的例子。

示例 -

输出

First Name is: Bruce
Last Name is: Banner
Full Name is: Bruce Banner
Email is: [email protected]
After changing the first name:
Full Name is: Natasha Banner
Email is: [email protected]

解释 -

在上面的代码中,@property 装饰器用于 full_name 函数,现在这个函数已经变成了属性,并且由于 @property 装饰器,它也可以用作 getter。

将 setter 和 deleter 方法与 @property 装饰器一起使用

应用 @property 装饰器的函数称为 getter。在前面的例子中,full_name 充当 getter。在本节中,我们将理解 getter 和 setter。

顾名思义,setter 方法设置属性的值,而 deleter 方法删除属性。让我们为 full_name 属性实现一个 setter 和 getter 方法。

示例 -

输出

21
Rishabh Pant
KL Rahul
Traceback (most recent call last):
  File "d:/Python Project/property.py", line 557, in 
    s1.name = ''
  File "d:/Python Project/bubble_sort.py", line 544, in name
    raise ValueError('Please Enter the Valid String')
ValueError: Please Enter the Valid String

解释 -

在上面的代码中,我们初始化了一个类 Student,并在构造函数中传递了 name 和 age。首先,我们创建了应用了 @property 装饰器的 age() 方法;它将获取 age 并返回。然后我们为 age 创建了 setter 方法,我们在其中检查用户输入的值是否为负数,如果是则引发错误。然后我们为 age 创建了 deleter 方法。我们对 name 属性也做了同样的事情。在 setter 方法中,我们检查用户输入的 name 是否为空字符串,如果是则引发错误,否则设置给定的 name。

示例 - 2

输出

Fullname is: Steve Rogers
Email address is:  [email protected]
Fullname of obj is:  Bruce Rogers
And email address: [email protected]
New Fullname of obj is: Peter Parker
Deleted the full_name

在上面的代码中,我们使用 property 装饰器创建了 getter、setter 和 deleter。

property() 函数

我们可以使用 property() 函数来创建 getter、setter 和 deleter,而不是使用 @property 装饰器。语法如下。

语法 -

参数 -

  • fget() - 它用于获取属性的值,与 getter 相同。
  • fset() - 它用于设置属性的值,与 setter 相同。
  • fdel() - 它用于删除属性值。
  • doc() - 它表示包含属性文档(docstring)的字符串。

它从给定的 getter、setter 和 deleter 返回一个 property 属性。

让我们理解下面的例子。

示例 -

输出

Full Name is:  Nick Fury
Email Address:  [email protected]
Full Name is:   Nick Fury
Email Address:  [email protected]
New Full Name is:  Bruce Banner
Deleted the full_name.

我们也可以用单行代码实现这些方法。

full_name = property(full_name_getter, full_name_setter, full_name_deleter)

重要提示

我们不需要为代码中的每个属性都创建所有三个方法。我们可以通过仅包含 getter 方法来定义只读属性。我们也可以省略 deleter 方法,而使用 getter 和 setter。如果我们想在实例创建时设置属性,或者它应该在类内部修改,我们可以省略 setter 方法。

用户可以根据他们工作的内容自由选择任何方法。

结论

本教程详细介绍了 property 装饰器及其示例。property() 方法有助于创建 getter、setter 和 deleter 方法。我们可以使用 @property 装饰器语法来定义属性,这种方式更兼容、更直接。它被认为是定义 getter、setter 和 deleter 的“pythonic”方式。

使用属性,我们可以在不影响类的内部实现的情况下修改它。getter、setter 和 deleter 有助于避免直接访问或修改数据。