@property装饰器 和 @属性名.setter 修改器
提示:本部分内容作为学习python中出现的细节理解,可能存在偏差欢迎评论纠正,作为学习笔记中可能存在过多口语化内容,抱歉。
在学习python的过程中,出现了装饰器和修改器的名词以及封装。十分疑惑,为什么要私有化,就是不希望别人看到呗,那么为什么还要设置装饰器让人家看到呢???在学习这部分内容的时候不知所以,故此记录下现阶段的疑问以及自己对当前问题的思考。
装饰器
class Person:
def __init__(self, name, age):
self._name = name # 使用下划线,标记为“私有”属性
self._age = age
@property
def name(self):
return self._name
@property
def age(self):
return self._age
@age.setter
def age(self, age):
if age >= 0:
self._age = age
else:
raise ValueError("年龄不能为负数")
为什么要设置私有属性?
self._name
的目的就是不希望外部能够访问修改。
其初衷在于隐藏内部实现的细节,使得属性不直接暴露给外部修改,以维护类的封装性。
第一个问题:
为什么要设置私有属性,却又通过装饰器的方式允许外界访问它们?难道就不能直接公开属性吗?这不是又当又立嘛!!
回答:
如果不设置私有属性的话,外部可以直接访问属性了,但是这个同时外部也可以直接进行修改属性值了,不能因为为了让用户访问数据而把所有权限都给出去,而这个python中@property
一定程度上赋予了权限的意味,通过对私有属性函数化的操作,实现了在外部调用和属性一样的方式。
稍微官方的回答:
私有属性确实是为了限制外部直接的访问和修改,但是我们仍旧需要提供一种方式允许外界能够“安全地”与这些属性进行交互。Python中的@property装饰器正好提供了这样的机制。通过把私有属性的获取和设置封装成方法,我们能够在外部以属性访问的形式来获取和设置它们,同时还能加入逻辑判断或处理,保障数据的安全性和有效性。
第二个问题:
你既然说装饰器的目的是为了赋予用户查看属性而赋予了部分权限。那修改器的作用赋予用户修改的权利,你同时赋予修改和查看属性的权利不就等于公开属性一样的操作嘛?
回答:
诚然同时赋予查看和修改的权限类似于公开属性,但是使用修改器@属性名.setter
,python中将修改的权限以这种类似函数方式实现,可以对修改的数据进行判断分析从而进行检验是否符合通过这种方式,更多的是可以在提供访问时附加一些条件检查或逻辑处理,比如:
- 验证新值的类型是否正确
- 检查新值是否在允许的范围内
- 修改另一个相关的属性值
- 触发特定的事件或调用
因此,虽然我们通过将属性设置为私有来隐藏它们,防止外部直接访问,但同时我们还希望提供一种受控的方式来让外界可以与这些私有属性交互,而@property装饰器及其setter和getter方法提供了一种非常优雅的方式来实现这一点。这样既保证了数据的封装性和安全性,也保持了类的易用性和灵活性。
将代码中的私有属性通过 @property装饰器和@属性名.setter修改器的方式编写,通过属性的方式直接看到属性值,加上()就可以直接实现属性的修改,即满足了安全性又满足了灵活修改的特性。