python-@property 和setter属性

T

一个装饰器,使得类中方法像属性一样被使用。

W

这是原本的类及其属性的访问

class Person():

    def __init__(self, firstname:str, lastname:str):
        self.first = firstname
        self.last = lastname
        self.full_name = self.first + ' '+ self.last

    def printFullname(self):
        return f"Full name is {
     
     self.full_name}."
    
person = Person('Jack','Swingming')
print(f"{
     
     person.first=}")
print(f"{
     
     person.last=}")
print(f"{
     
     person.full_name=}")
print(f"{
     
     person.printFullname()=}")
person.first='Jack'
person.last='Swingming'
person.full_name='Jack Swingming'
person.printFullname()='Full name is Jack Swingming.'

但是如果我修改了self.first,我希望full_name 一起修改,该如何做呢?

这里就用函数可以实现

class Person():

    def __init__(self, firstname:str, lastname
Python 中,`@property` 装饰器提供了一种简洁且优雅的方式来定义类属性的 getter、setter deleter 方法。这种机制允许将方法伪装成属性,使得访问修改类内部状态时能够实现封装性数据验证,而不需要破坏原有的接口设计。 ### 使用 `@property` 定义 Getter 通过将一个方法标记为 `@property`,可以将其作为只读属性暴露给外部调用者。该方法不能接受除 `self` 之外的其他参数,并返回内部状态的值。例如: ```python class Person: def __init__(self, name): self._name = name @property def name(self): return self._name ``` 在这个例子中,`name` 属性可以通过 `obj.name` 访问,但无法直接设置值。这有助于防止外部代码随意修改对象的状态[^2]。 ### 使用 `.setter` 定义 Setter 为了允许对属性进行赋值操作,需要使用装饰器 `@属性.setter` 来定义 setter 方法。这个方法通常用于执行值验证或转换后再赋值。例如: ```python class Person: def __init__(self, name): self._name = name @property def name(self): return self._name @name.setter def name(self, value): if not isinstance(value, str): raise TypeError("Name must be a string") self._name = value ``` 这样,在尝试将非字符串类型的值赋给 `name` 属性时,会抛出异常,从而确保了数据的一致性[^3]。 ### 使用 `.deleter` 定义 Deleter 如果希望支持删除属性的操作,可以通过 `.deleter` 装饰器来定义相应的处理逻辑。例如: ```python class Person: def __init__(self, name): self._name = name @property def name(self): return self._name @name.setter def name(self, value): if not isinstance(value, str): raise TypeError("Name must be a string") self._name = value @name.deleter def name(self): del self._name ``` 当调用 `del obj.name` 时,会触发定义的 `deleter` 方法,从而安全地释放相关资源[^4]。 ### 结合 Property 实现更复杂的逻辑 除了简单的类型检查外,`@property` 还可用于更复杂的业务场景。例如,下面的 `Fees` 类利用 property 控制费用字段的赋值行为,包括从字符串到 `Decimal` 类型的自动转换: ```python from decimal import Decimal class Fees: def __init__(self): self._fee = None @property def fee(self): return self._fee @fee.setter def fee(self, value): if isinstance(value, str): self._fee = Decimal(value) elif isinstance(value, Decimal): self._fee = value ``` 这样的设计不仅提升了代码的可维护性,也增强了数据的健壮性[^4]。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值