千家信息网

python中@property装饰器怎么用

发表于:2025-11-07 作者:千家信息网编辑
千家信息网最后更新 2025年11月07日,这篇文章主要介绍python中@property装饰器怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!一、property的装饰器用法先简单上个小栗子说明:class pr
千家信息网最后更新 2025年11月07日python中@property装饰器怎么用

这篇文章主要介绍python中@property装饰器怎么用,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

一、property的装饰器用法

先简单上个小栗子说明:

class property(fget=None,fset=None,fdel=None,doc=None)

  • fget是用于获取属性值的函数

  • fset是用于设置属性值的函数

  • fdel是用于删除属性值的函数

  • doc为属性对象创建文档字符串

使用property可以讲类的方法变成同名属性,使用起来更加简洁,最后实例展示

使用时建议直接用property的装饰器用法, 比较简洁,下面是官方示例,利用@property装饰方法x将其变成名称相同的属性, 通过fget, fset, fdel可以控制x的读写删属性.

class C:    def __init__(self):        self._x = None    @property    def x(self):        """I'm the 'x' property."""        return self._x    #设置fset,注意x要与@property修饰的方法名称相同    @x.setter    #这个fset名称没有限制,建议与x相同    def x(self, value):        self._x = value    #设置fdel    @x.deleter    def x(self):        del self._x

话不多说, 直接上例子, 在Man这个类中设置一个可读可写的birthYear属性,一个可读gender属性,一个可读可写可删的体重属性,还有一个利用birthYear推算出的age属性

""" @property, @*.setter"""from datetime import datetimeclass Man:    def __init__(self, birthYear=None, gender=None, weight=None):        """1.使用@property可以隐藏私有属性,例如把'_birthYear'属性隐藏,             把property对象birthYear作为对外的属性"""        self._birthYear = birthYear        self._gender = gender        self._weight = weight    @property    def birthYear(self):        return self._birthYear        @birthYear.setter    def birthYear(self, value):       """2.可以在setter中对属性输入进行限制或者其他操作"""        assert not value > datetime.now().year, f'please input the right value!'        self._birthYear = value    @property    """3.获取年龄直接用obj.age,而不需写成方法obj.age(), 更加自然方便"""    def age(self):        return datetime.now().year - self._birthYear    @property    def gender(self):        return self._gender    @property    def weight(self):        return self._weight        @weight.setter    def weight(self, value):        self._weight = value    @weight.deleter    def weight(self):        del self._weightlilei = Man(1996, 'male', 180)age = lilei.ageprint('Lilei今年{}岁\n'.format(age))# 设置性别try:    lilei.gender = 'female'except:    print('性别无法进行更改!\n')# 更新体重print(f'lilei减肥前的体重:{lilei.weight}\n')lilei.weight = 200print(f'lilei减肥后的体重:{lilei.weight}\n')print('lilei减肥失败后一气之下将体重信息删了\n')del lilei.weighttry:    print('lilei的体重{}'.format(lilei.weight))except:    print('找不到lilei的体重信息!')

输出结果:

Lilei今年25岁

性别无法进行更改!

lilei减肥前的体重:180

lilei减肥后的体重:200

lilei减肥失败后一气之下将体重信息删了

找不到lilei的体重信息!

二、举例说明

现在让我们直观看一下python内置property修饰器为什么会存在,可以用来解决什么问题?

先来一个具体的例子,定义一个表示摄氏度的class并且这个类包含一个从摄氏度转换到华氏温度的方法。

1.不用setter和getter方法的实现

# 初始版本class Celsius:    def __init__(self, temperature = 0):        self.temperature = temperature    def to_fahrenheit(self):        return (self.temperature * 1.8) + 32# 实例化human = Celsius()# 设置温度human.temperature = 37# 获取温度值print(human.temperature)# 调用内置方法将摄氏度转化为华氏温度print(human.to_fahrenheit())

输出结果:

37
98.60000000000001

2.使用setter和getter的实现,增加温度值输入的限制

但是如果现在有人让human.temperature = -300 , 我们知道摄氏温度是不可能低于-273.15的,此时需要对温度值进行限制, 常规方法是设置一个温度值的settergetter的方法,此时温度值存放在_temperature

# 更新温度限制的版本class Celsius:    def __init__(self, temperature=0):        self.set_temperature(temperature)    def to_fahrenheit(self):        return (self.get_temperature() * 1.8) + 32    # getter method    def get_temperature(self):        return self._temperature    # setter method    def set_temperature(self, value):        if value < -273.15:            raise ValueError("摄氏温度不可能低于 -273.15 !")        self._temperature = value# 实例化human = Celsius(37)# 使用添加的getter获取温度值print(human.get_temperature())# 调用内置方法将摄氏度转化为华氏温度print(human.to_fahrenheit())# 使用添加的setter对温度值进行设置human.set_temperature(-300)# Get the to_fahreheit methodprint(human.to_fahrenheit())

毫无疑问,在设置温度值等于-300的时候肯定会报错,但是这个时候你可能发现设置和获取温度值的代码发生变化而且更复杂 并且 你需要对Celsius类的初始化函数进行更改,self.temperature = temperatureself.set_temperature(temperature), 如果现在是一个拥有很多属性的类, 一个一个去进行这样的更改是很麻烦的,而且可能会导致与这个类别相关的代码出现错误, 有没有更好的实现方式呢?这个时候就该今天的主角property装饰器出场了

3.利用property装饰器实现的版本

# 使用 @property 装饰器版本class Celsius:    def __init__(self, temperature=0):        #这里的self.temperture是下面定义的property对线 temperatue        #所以你会发现在初始化Celsius时, 调用了temperature.setting方法        self.temperature = temperature    def to_fahrenheit(self):        return (self.temperature * 1.8) + 32    @property    def temperature(self):        print("获取温度值...")        return self._temperature    @temperature.setter    def temperature(self, value):        print("设置温度值...")        if value < -273.15:           raise ValueError("摄氏温度不可能低于 -273.15 !")        self._temperature = value# 用property的实现后获取和设置温度值与最初的版本一样!human = Celsius()# 设置温度human.temperature = 37# 获取温度值print(human.temperature)# 调用内置方法将摄氏度转化为华氏温度print(human.to_fahrenheit())#测试温度限制功能human.temperature = -300

输出结果:

设置温度值...
设置温度值...
获取温度值...
37
获取温度值...
98.60000000000001
设置温度值...
---------------------------------------------------------------------------
ValueError Traceback (most recent call last)
d:\2.github\python_demo\016_decorator.py in
30
31 #测试温度限制功能
---> 32 human.temperature = -300

d:\2.github\python_demo\016_decorator.py in temperature(self, value)
16 print("设置温度值...")
17 if value < -273.15:
---> 18 raise ValueError("摄氏温度不可能低于 -273.15 !")
19 self._temperature = value
20

ValueError: 摄氏温度不可能低于 -273.15 !

可以看到此时temperature设置有限制而且获取和设置温度值的代码与初始版本一模一样,也就是说代码可以向后兼容

以上是"python中@property装饰器怎么用"这篇文章的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

温度 属性 方法 体重 限制 版本 减肥 摄氏温度 代码 信息 函数 华氏温度 相同 名称 实例 性别 时候 结果 输出 简洁 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 华为网络技术国宝老师视频 内蒙古互联网软件开发中心 网络安全需注意事项 无线网络安全手抄报装饰 金蝶数据库怎么重新安装不了 建筑师服务器一般在哪 racle数据库版本 郑州软件开发的优服务 查看数据库当前用户 媒介环境学派 网络技术 环保局网络安全宣传周活动总结 安徽存储服务器机箱定制虚拟主机 网络安全是国家的吗 华为服务器开不了机的原因 法律界如何看网络安全法 sql统计条件的数据库 湖北省哪里招聘网络安全工程师 腾讯云海外服务器可以搭 我的世界粘土服务器制作 申请iso9001软件开发 软件工程师服务器 克州软件开发厂家价格 实验3 数据库安全性控制 长沙直播软件开发报价 国企总部服务器管理系统 网络安全咨询顾问挣多吗 宝山区服务器设备回收厂家 web服务器端口怎么关闭 金融公司网络安全总结报告 智能互联网络技术基础
0