[Python3]property的使用

本文介绍Python中如何使用property装饰器来封装类的属性,通过示例演示如何定义getter、setter和deleter方法,实现对类属性的安全访问与修改。

property的使用

property是一种特殊的属性,访问它时会执行一段功能(函数)然后返回值
使用property的场景
将一个类的函数定义成特性以后,对象再去使用的时候obj.name,根本无法察觉自己的name是执行了一个函数然后计算出来的,这种特性的使用方式遵循了统一访问原则。

python并没有在语法上把它们三个内建到自己的class机制中,在C++里一般会将所有的所有的数据都设置为私有的,然后提供set和get方法(接口)去设置和获取,在python中通过property方法可以实现

class People():
    def __init__(self, name):
        self.__name = name
    @property
    def name(self):
        return self.__name
    @name.setter
    def name(self, val):
        if not isinstance(val, str):
            print('名字必须是字符串类型')
            return
        self.__name = val
    @name.deleter
    def name(self):
        print('不允许删除')
p = People('wyq')
print(p.name)
p.name = 'qyw'
print(p.name)
del p.name


class Foo:
    def __init__(self, name):
        self.name = name
    def tell_info(self):
        print('名字是%s' % self.name)


p = Foo('wyq')
print(p.tell_info())
print('-------')
 

<think>好的,用户想了解Python中@property装饰器的用法。首先,我需要回顾一下自己的知识,确保理解正确。property装饰器主要用于将类的方法转换为属性,这样可以实现属性的访问、设置和删除控制,同时保持接口的一致性。 首先,应该解释@property的基本作用,让用户明白它的用途。比如,可以用来验证数据或者在获取属性时进行计算。然后,需要分步骤说明如何使用@property,可能包括定义getter、setter和deleter方法。 接下来,可能需要一个具体的例子来演示。例如,创建一个类,其中有一个属性需要验证,比如年龄不能是负数或者非整数。使用@property装饰器后,可以在设置属性时自动进行验证,而用户无需调用额外的方法,直接像访问属性一样使用。 还要注意常见的错误,比如用户在使用setter时可能会忘记正确命名,导致TypeError。例如,正确的方法应该是使用@属性名.setter,而不是@property.setter。这时候需要提醒用户注意这个细节,并给出正确的代码示例。 此外,可能需要比较使用property装饰器和传统getter/setter方法的区别,突出property的优点,比如代码更简洁,保持向后兼容性等。 用户提供的引用中有提到一些常见错误,比如错误地使用property.setter而不是正确的方法名,这点需要特别强调,避免用户重复犯错。同时,引用中的示例代码有错误,可以引用这些例子来说明正确写法。 最后,生成相关问题的时候,要考虑用户可能进一步想知道的内容,比如property的应用场景、与传统方法的对比、性能影响,以及如何处理更复杂的验证逻辑等。 总结一下,回答的结构应该是先介绍概念,再分步骤讲解用法,给出代码示例,指出常见错误,最后总结优点和应用场景。确保语言简洁明了,符合中文表达习惯,并且代码格式正确,数学表达式用$...$包裹,独立公式用$$...$$。</think>### Python中@property装饰器的使用详解 #### 一、核心概念 `@property`装饰器可将方法转换为**类属性**,实现对属性访问的精细化控制。通过`@property`、`@属性名.setter`和`@属性名.deleter`三个装饰器,分别控制属性的读取、修改和删除行为[^1]。 #### 二、使用步骤 1. **基础属性定义** ```python class Student: def __init__(self, score): self._score = score # 内部使用保护属性 @property def score(self): print("Getting score") return self._score # 访问方式 s = Student(90) print(s.score) # 触发getter方法 ``` 2. **添加验证逻辑(Setter)** ```python @score.setter def score(self, value): if not 0 <= value <= 100: raise ValueError("成绩需在0-100之间") self._score = value s.score = 85 # 正常赋值 s.score = 120 # 触发ValueError异常[^3] ``` 3. **删除控制(Deleter)** ```python @score.deleter def score(self): print("禁止删除成绩") del self._score # 实际业务中可能需要更复杂的处理 del s.score # 触发deleter方法 ``` #### 三、典型错误解析 错误示例: ```python @property.setter # ❌ 错误写法 def score(self, value): ... ``` 正确写法: ```python @score.setter # ✅ 正确写法 def score(self, value): ... ``` 注意装饰器命名必须与@property定义的方法名**严格一致**,否则会触发`TypeError`[^3]。 #### 四、应用优势 1. **接口兼容性**:将传统方法调用转换为属性访问,不影响现有代码 2. **数据验证**:自动执行类型检查、范围验证等操作 3. **延迟计算**:仅在访问属性时执行计算逻辑 ```python class Circle: def __init__(self, radius): self.radius = radius @property def area(self): return 3.14 * self.radius ** 2 # 动态计算 c = Circle(5) print(c.area) # 输出78.5 ``` #### 五、性能考量 虽然`@property`会增加少量调用开销,但相比其提供的安全性和灵活性,在大多数业务场景中是可接受的。性能敏感场景建议直接访问属性。 $$ \text{总开销} = \text{方法调用时间} \times \text{访问频率} $$
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值