property装饰器

Python property装饰器详解
# 需要了解的property的用法
class People:
    def __init__(self,name):
        self.__name=name

    @property
    def name(self):
        return '<name:%s>' %self.__name

    @name.setter
    def name(self,new_name):
        if type(new_name) is not str:
            print('名字必须是str类型')
            return
        self.__name=new_name

    @name.deleter
    def name(self):
        del self.__name

obj=People('egon')  #查看 name 
print(obj.name)

obj.name='ok' #修改 name 属性
print(obj.name)

del obj.name    #删除 name 属性
print(obj.__dict__)

结果:

<name:egon>
<name:ok>
{}

 

关于property装饰器的使用顺序:

class People:
    def __init__(self,name):
        self.__name=name

    def xxx_name(self):        #查看
        return '<name:%s>' %self.__name

    def yyy_name(self,new_name):    #修改
        if type(new_name) is not str:
            print('名字必须是str类型')
            return
        self.__name=new_name

    def zzz_name(self):        #删除
        del self.__name

    name=property(xxx_name,yyy_name,zzz_name)  #格式命名,固定的顺序(查->改->删)

obj=People('egon')
print(obj.name)

# obj.name=123
# print(obj.name)

del obj.name
print(obj.__dict__)

 

如果要在类外面调用类中的隐藏属性就可以使用property

 

转载于:https://www.cnblogs.com/TF511/p/9844718.html

<think>我们正在讨论Python中的@property装饰器。根据引用[1][2][3][4],我们可以总结如下:@property装饰器是Python内置的一种装饰器,用于将一个方法转换为属性,使得我们可以像访问属性一样访问方法,而不需要加上括号。同时,它还可以提供对属性的封装,允许我们定义setter和deleter来控制属性的设置和删除。引用[1]指出:@property把一个类的getter方法变成属性,如果还有setter方法,就在setter方法前面加上@method.setter。引用[2]进一步说明:@property装饰器允许我们将方法作为属性来访问,使得代码更加简洁、清晰,并提供了更好的封装性。引用[3]提到:@property装饰器是一个强大的工具,它允许我们将方法作为属性来访问。 引用[4]则介绍了delattr()函数,这与属性的删除有关,但在@property中,我们可以通过定义deleter来控制删除行为。 因此,我们可以这样组织回答: 1.作用:将方法转换为属性,提供封装性(可以控制属性的访问、设置和删除)。2.使用:包括三个部分:@property(用于getter)、@属性名.setter(用于setter)、@属性名.deleter(用于deleter)。下面我们详细展开。注意:在回答中,我们使用中文,并按照系统级指令的要求处理数学表达式(虽然本题可能不涉及数学表达式,但如果有变量名等,我们会用$...$格式)。由于问题不涉及数学公式,我们主要关注代码和文字描述。另外,根据要求,我们需要在回答末尾生成相关问题。现在开始编写回答。</think>### Python @property 装饰器详解 #### 一、作用原理 `@property` 是 Python 的内置装饰器,用于**将方法转换为只读属性**,实现更优雅的封装。其核心原理是通过描述符协议(Descriptor Protocol)实现: 1. **方法转属性**:将类方法转换为可直接访问的属性 ```python class Circle: def __init__(self, radius): self._radius = radius @property def radius(self): # 访问时自动调用 return self._radius c = Circle(5) print(c.radius) # 直接访问而非调用方法() ``` 2. **封装控制**:通过 setter/deleter 实现数据验证 ```python class Circle: @property def radius(self): ... @radius.setter def radius(self, value): # 设置属性时触发 if value <= 0: raise ValueError("半径必须为正数") self._radius = value @radius.deleter def radius(self): # 删除属性时触发 print("禁止删除半径") del self._radius ``` #### 二、核心优势 1. **统一访问接口**:消除 `get_xxx()`/`set_xxx()` 方法 2. **数据验证**:在属性赋值时执行检查逻辑 3. **延迟计算**:属性值在访问时动态计算 ```python @property def area(self): return 3.14 * self._radius**2 # 每次访问实时计算 ``` #### 三、典型应用场景 1. **数据校验**(如类型/范围检查) ```python @age.setter def age(self, value): if not isinstance(value, int): raise TypeError("年龄需为整数") self._age = value ``` 2. **数据转换**(自动格式转换) ```python @property def birth_year(self): return datetime.now().year - self._age ``` 3. **访问控制**(如只读属性) ```python @property def id(self): # 提供只读ID return self._generate_id() ``` #### 四、实现机制解析 当使用 `@property` 时,Python 会自动创建**属性描述符**: ```mermaid graph LR A[访问 obj.attr] --> B{描述符存在?} B -->|是| C[调用 __get__ 方法] B -->|否| D[直接访问属性] C --> E[返回计算值] ``` 通过描述符协议,`@property` 在访问属性时动态调用绑定方法,这是实现方法转属性的底层机制[^1][^2]。 #### 五、最佳实践 1. **命名规范**:保护属性用 `_前缀`(如 `_radius`) 2. **只读属性**:仅定义 getter 不定义 setter 3. **避免副作用**:getter 方法应为纯函数 4. **替代方案**:简单场景可直接使用 `property()` 函数 ```python class C: def get_x(self): ... def set_x(self): ... x = property(get_x, set_x) # 函数式声明 ``` > 关键点:`@property` 实现了**封装**与**接口简化**的统一,是 Pythonic 面向对象编程的核心工具之一[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值