网易首页 > 网易号 > 正文 申请入驻

Python 内置函数:property()

0
分享至

在面向对象编程中,我们常常需要对类的属性访问进行控制。例如,某些属性需要在获取时自动计算,或在设置时进行验证。Python 提供了内置函数 property(),它能将类的方法转换为“属性访问”的形式,从而实现更优雅的封装。

一、函数语法

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

参数:

fget:可选。获取属性值的函数(对应 getter)。

fset:可选。设置属性值的函数(对应 setter)。

fdel:可选。删除属性值的函数(对应 deleter)。

doc:可选。属性的文档字符串。

返回值:

返回一个 property 对象,可以作为类的属性使用。

二、基础用法示例

1、使用 property() 创建只读属性

class Circle:
    def __init__(self, radius):
        self._radius = radius

    def get_area(self):
        return 3.14 * self._radius ** 2

    area = property(get_area)    # area 就是通过 property() 创建的只读属性

c = Circle(5)
print(c.area)  # 78.5
# c.area = 100  # AttributeError: can't set attribute

2、定义 getter、setter、deleter

class Person:
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return self._name

    def set_name(self, value):
        if not isinstance(value, str):
            raise ValueError("名字必须是字符串")
        self._name = value

    def del_name(self):
        print("删除名字属性")
        del self._name

    name = property(get_name, set_name, del_name, "姓名属性")

p = Person("Alice")
print(p.name)     # 读取 → 调用 get_name
p.name = "Bob"    # 写入 → 调用 set_name
del p.name        # 删除 → 调用 del_name

三、进阶技巧

1、使用装饰器语法

在现代 Python 中,通常用 @property 装饰器及其配套的 @ .setter、@ .deleter 来代替直接调用 property()。

class Rectangle:
    def __init__(self, width, height):
        self._width = width
        self._height = height

    @property
    def area(self):
        return self._width * self._height

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, value):
        if value <= 0:
            raise ValueError("宽度必须为正数")
        self._width = value

r = Rectangle(3, 4)
print(r.area)   # 12
r.width = 10
print(r.area)   # 40

2、控制属性访问逻辑

property() 常用于:

(1)数据验证(setter 中做检查)。

(2)只读属性(只定义 getter)。

(3)懒加载计算(在 getter 中动态生成)。

(4)封装内部实现(外部访问时仍像普通属性)。

四、property() 特点

property 对象本质上是一个数据描述符,通过 __get__、__set__、__delete__ 方法实现属性访问控制。

1、优点

统一了“方法调用”和“属性访问”的接口形式,提高代码可读性。

保持对外接口不变的情况下,可以随时在内部增加逻辑。

2、兼容性

property() 与 @property 装饰器写法等价。

推荐装饰器写法,更简洁、直观。

五、补充说明

1、property 与封装

它体现了面向对象中的封装思想,把属性保护在内部,仅通过受控接口访问。

2、常见误区

误以为 property 是语法糖;实际上它是一个类(class property),实现了描述符协议。

3、property 只在类定义中使用;在实例中直接调用 property() 不会生效。

4、应用场景

数据模型(ORM 框架)。

配置类(对外接口稳定,内部逻辑可扩展)。

动态计算属性(如面积、体积、缓存属性)。

小结

property() 是 Python 提供的属性访问控制机制,它将方法转换为属性访问,既能隐藏实现细节,又能增加数据校验和逻辑处理。无论是通过 property() 函数还是 @property 装饰器,合理使用它都能让代码更优雅、更安全。

点赞有美意,赞赏是鼓励

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
东方甄选轰然塌方:主播集体辞职,会员排队退款,俞敏洪多次致歉

东方甄选轰然塌方:主播集体辞职,会员排队退款,俞敏洪多次致歉

听心堂
2026-04-26 18:53:49
赖昌星的情人蔡玲玲:悔不该委身于他,58岁的她现状如何?

赖昌星的情人蔡玲玲:悔不该委身于他,58岁的她现状如何?

风雨与阳光
2026-04-27 02:36:27
色情片并不可怕,但它会偷走你的“劲”,让你做什么都索然无味

色情片并不可怕,但它会偷走你的“劲”,让你做什么都索然无味

知识圈
2026-04-26 09:35:01
出差垫5100只报250,我不吵不闹,下次派出差任务,任务传三圈没人接

出差垫5100只报250,我不吵不闹,下次派出差任务,任务传三圈没人接

夜阑故事集
2025-09-24 11:45:02
北约前秘书长:无特朗普相助,英法应领导新北约,乌克兰将被纳入

北约前秘书长:无特朗普相助,英法应领导新北约,乌克兰将被纳入

时光流转追梦人
2026-04-27 09:16:01
67岁迟志强现状:出狱37年后,定居黑龙江,儿子工作令人泪目

67岁迟志强现状:出狱37年后,定居黑龙江,儿子工作令人泪目

蹲坑看世界
2026-04-25 19:10:38
皮蛋再次成为关注对象!研究发现:高血脂吃皮蛋,身体或有6改善

皮蛋再次成为关注对象!研究发现:高血脂吃皮蛋,身体或有6改善

健康科普365
2026-04-25 09:27:08
恩佐破荒成蓝军队史第三,切尔西中场射手榜,第一无悬念

恩佐破荒成蓝军队史第三,切尔西中场射手榜,第一无悬念

乐道足球
2026-04-27 09:39:34
科尔:詹姆斯简直是一台机器,他是人类历史上最伟大的运动员

科尔:詹姆斯简直是一台机器,他是人类历史上最伟大的运动员

懂球帝
2026-04-27 08:33:25
尴尬!一主管在工作群发离职感言,被下属怒怼,网友:就悄悄走吧

尴尬!一主管在工作群发离职感言,被下属怒怼,网友:就悄悄走吧

火山詩话
2026-04-26 14:15:15
黄一鸣回应:没结婚一天找8个男的也没关系 承认跟40岁大叔交往过

黄一鸣回应:没结婚一天找8个男的也没关系 承认跟40岁大叔交往过

奇思妙想草叶君
2026-04-24 22:03:45
詹俊点评英超争冠:两队可能客场丢分 阿森纳锋无力 曼城难度更大

詹俊点评英超争冠:两队可能客场丢分 阿森纳锋无力 曼城难度更大

智道足球
2026-04-27 07:46:53
四川控烟新规5月1日生效,室内全禁烟,违规最高罚2000元!

四川控烟新规5月1日生效,室内全禁烟,违规最高罚2000元!

老特有话说
2026-04-26 16:04:05
岛内最新民调公布,支持两岸统一人数有惊人变化,赖清德要急

岛内最新民调公布,支持两岸统一人数有惊人变化,赖清德要急

阿天爱旅行
2026-04-26 03:08:20
至今仍健在的开国将帅只剩一位,今年103岁高龄,身体依旧硬朗

至今仍健在的开国将帅只剩一位,今年103岁高龄,身体依旧硬朗

边城少爷
2026-04-27 06:59:56
汤尤杯第3日:昆拉武特神奇逆转乔纳坦,安洗莹带队横扫保加利亚

汤尤杯第3日:昆拉武特神奇逆转乔纳坦,安洗莹带队横扫保加利亚

钉钉陌上花开
2026-04-27 06:43:04
2026款雪铁龙梅哈里实车曝光 内饰极简 首搭1.2L混动

2026款雪铁龙梅哈里实车曝光 内饰极简 首搭1.2L混动

三农老历
2026-04-27 08:44:10
超级大买家,突然开始卖了。

超级大买家,突然开始卖了。

格隆汇
2026-04-26 12:14:02
老外震惊!中国馒头横扫欧美!不是文化输出,是中国供应链赢麻了

老外震惊!中国馒头横扫欧美!不是文化输出,是中国供应链赢麻了

魔都姐姐杂谈
2026-04-24 11:56:08
全红婵最新消息,瘦了一大圈!全红婵武汉复出参赛,为不实消息

全红婵最新消息,瘦了一大圈!全红婵武汉复出参赛,为不实消息

开成运动会
2026-04-26 22:32:59
2026-04-27 09:55:00
MediaTea
MediaTea
专业的数字媒体、新媒体技术
1826文章数 80关注度
往期回顾 全部

科技要闻

打1折!DeepSeek输入缓存降价

头条要闻

四位人气主播宣布离职 大批用户申请退出东方甄选会员

头条要闻

四位人气主播宣布离职 大批用户申请退出东方甄选会员

体育要闻

最抽象的天才,正在改变瓜迪奥拉

娱乐要闻

广电总局发布2026年“微短剧+”行动计划推荐剧目

财经要闻

DeepSeek融资、字节加码 AI开始真烧钱了

汽车要闻

预售19.38万元起 哈弗猛龙PLUS七座版亮相

态度原创

本地
房产
数码
时尚
公开课

本地新闻

云游中国|逛世界风筝都 留学生探秘中国传统文化

房产要闻

新一轮教育大爆发来了!海口,开始疯狂建学校!

数码要闻

1LCD投影仪成绝对主流:大眼橙第一、小米第三

比起买大件,这些“小装备”更派得上用场!

公开课

李玫瑾:为什么性格比能力更重要?

无障碍浏览 进入关怀版