Python property装饰器详解与实战案例

码头散步
码头散步
发布时间:2026-10-16| 9人浏览过
原创

本文详细介绍Python中property装饰器的两种定义方式及其参数含义。通过装饰器语法和类属性传参两种方法,展示如何将函数伪装为数据属性,实现访问、设置和删除属性的自动化控制。文中包含BMI计算及姓名管理的完整代码案例,帮助开发者理解属性访问的一致性与封装性。

1.property

装饰器是一种在不修改被装饰对象源代码及调用方式的前提下,为其添加新功能的可调用对象。

property是Python内置的一个装饰器,主要用于将类中的方法绑定为对象的数据属性。

通过应用property装饰器,类中的函数可以被“伪装”成对象的数据属性。当对象访问该特殊属性时,会自动触发相关功能的执行,并将返回值作为访问结果。

使用property能够有效保证属性访问的一致性。此外,它还提供了设置和删除属性的功能接口。

应用场景:当某些功能在语义上更接近数据属性时,Python提供了一种装饰器机制,可以将这种功能属性伪装成数据属性,从而简化调用方式。

2.property属性定义的两种方式

A、装饰器方式

在类的方法上应用@property装饰器,即上述提到的第一种方式。

B、类属性方式

通过创建一个实例对象并赋值给类属性的方式来实现。

>>> class Lemons():
        def __init__(self,unit_price=7):
            self.unit_price = unit_price
        def get_unit_price(self):
            return self.unit_price
        def set_unit_price(self,new_unit_price):
            self.unit_price = new_unit_price
        def del_unit_price(self):
            del self.unit_price
        x = property(get_unit_price, set_unit_price, del_unit_price)
>>> fruit = Lemons()
>>> 
>>> fruit.x                         #调用 fruit.x 触发 get_unit_price
7
>>> 
>>> fruit.x = 9                     #调用 fruit.x = 9 触发 set_unit_price
>>> 
>>> fruit.x
9
>>> 
>>> fruit.unit_price                #调用 fruit.unit_price 触发 get_unit_price
9
>>> del fruit.x                     #调用 del fruit.x 触发 del_unit_price 
>>> 
>>> fruit.unit_price
Traceback (most recent call last):
  File "<pyshell#23>", line 1, in <module>
    l.unit_price
AttributeError: 'Lemons' object has no attribute 'unit_price'

property方法可以接收四个参数,分别对应不同的操作行为。

  • 第一个参数是获取属性的方法名,当调用 对象.属性 时自动触发。
  • 第二个参数是设置属性的方法名,当给属性赋值时自动触发。
  • 第三个参数是删除属性的方法名,当执行删除属性操作时自动触发。
  • 第四个参数是字符串类型的描述文档,当调用 对象.属性.doc 时触发。

3.案例

""" 成人的BMI数值标准: 过轻:低于18.5 正常:18.5-23.9 过重:24-27 肥胖:28-32 非常肥胖, 高于32 体质指数(BMI)=体重(kg)÷身高^2(m) 示例:70kg÷(1.75×1.75)=22.86 """

案例一:

 class People:
     def __init__(self, name, weight, height):
         self.name = name
         self.weight = weight
         self.height = height
# 定义函数的原因1:
# 1、从bmi的公式上看,bmi应该是触发功能计算得到的
# 2、bmi是随着身高、体重的变化而动态变化的,不是一个固定的值
#    说白了,每次都是需要临时计算得到的
# 但是bmi听起来更像是一个数据属性,而非功能
	 @property
	 def bmi(self):
		return self.weight / (self.height ** 2)
 obj1 = People('egon', 70, 1.83)
 print(obj1.bmi())
 obj1.height=1.86
 print(obj1.bmi())
 print(obj1.bmi)

案例二:

'''
学习中遇到问题没人解答?小编创建了一个Python学习交流群:711312441
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
 class People:
     def __init__(self, name):
         self.__name = name
     def get_name(self):
         return self.__name
     def set_name(self, val):
         if type(val) is not str:
             print('必须传入str类型')
             return
         self.__name = val
     def del_name(self):
         print('不让删除')
         # del self.__name
     name=property(get_name,set_name,del_name)
 obj1=People('egon')
 # print(obj1.get_name())
 # obj1.set_name('EGON')
 # print(obj1.get_name())
 # obj1.del_name()
 # 人正常的思维逻辑
 print(obj1.name) #
 # obj1.name=18
 # del obj1.name

案例三:

class People:
    def __init__(self, name):
        self.__name = name
    @property
    def name(self): # obj1.name
        return self.__name
    @name.setter
    def name(self, val): # obj1.name='EGON'
        if type(val) is not str:
            print('必须传入str类型')
            return
        self.__name = val
    @name.deleter
    def name(self): # del obj1.name
        print('不让删除')
        # del self.__name
obj1=People('egon')
# 人正常的思维逻辑
print(obj1.name) #
# obj1.name=18
# del obj1.name

到此这篇关于Python property装饰器使用案例介绍的文章就介绍到这了,更多相关Python property内容请搜索本站以前的文章或继续浏览下面的相关文章希望大家以后多多支持本站!

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。