Python中的getter与setter及deleter使用示例讲解
作者:Jenrey
假如我们需要写一个矩形的类,对象属性包括矩形的长和宽。
我们需要写一个方法计算矩形的面积。
原始代码
"""__dict__属性:查看对象内部所有属性名和属性值组成的字典 在Python类的内部,无论是类属性还是实例属性,都是以字典的形式进行存储的,其中属性名作为键,而值作为该键对应的值。 """ # 定义类 class Rect: # 定义属性 def __init__(self, length=0, width=0): self.length = length self.width = width self.area = length * width # 定义方法 def area(self): self.area = self.width * self.length return self.area # 创建一个长为4宽为5的矩形对象,计算面积 r1 = Rect(4, 5) print(r1.area) # 20 # 直接修改矩形面积属性值 r1.area = 100 print(r1.__dict__) # {'length': 4, 'width': 5, 'area': 100} # 修改矩形宽度以达到修改矩形面积的效果, 失败 r1.width = 111111 print(r1.area) # 100 print(r1.__dict__) # {'length': 4, 'width': 111111, 'area': 100} # 修改矩形长度以达到修改矩形面积的效果,失败 r1.length = 9999999 print(r1.area) # 100 print(r1.__dict__) # {'length': 9999999, 'width': 10, 'area': 100} print(Rect.__dict__) print(r1.__dict__)
以上代码实现了给出长宽计算面积的功能。但是,也可以在不修改长宽的情况下直接修改面积的值,很明显是不切合实际的。而且,我们通过修改长宽的值,面积也没有跟着改变。
这种情况下,我们就需要用到Python中的 getter 和 setter来帮我们实现该功能了。
使用getter和setter的代码
@property
: 是python内置的装饰器,实现类似JavaBean的结构。当一个方法(函数)的最终目的是返回一个值时,可以@property装饰该方法,会将函数转化为具有相同名称的只读属性,即"getter"。
setter
以及 deleter
方法:一定要给附加函数与原始的特征属性相同的名称。即必须要先有@property才能去定义后面的setter和deleter,特别注意@property代码段要写在setter和deleter代码段的前面,而且setter和deleter的函数名要和@property修饰的函数名一样。
# 注意:这里的getter、setter、deleter所修饰的函数名(func_area)的命名并不符合规范 # 只是为了更好的理解 “将函数转化为具有相同名称的属性” 这句话 # 正确的规范应该是 不带_ 的属性名 class Rect: def __init__(self, length=0, width=0): self.length = length self.width = width self._area = length * width # 为了规范需要设置成保护成员属性 # 定义getter对应的函数 @property # 需要@property装饰器 def func_area(self): print("重新计算面积并赋值") self._area = self.width * self.length return self._area # @property修饰的函数需要一个返回值 # @func_area.setter # 需要 @函数名.setter 的装饰器 # def func_area(self, value): # raise ValueError @func_area.setter # 需要 @函数名.setter 的装饰器 def func_area(self, value): self._area = value @func_area.deleter def func_area(self): del self._area r1 = Rect(4, 5) print(r1.func_area) # 20 r1.width = 10 print(r1.func_area) # 40 r1.length = 20 print(r1.func_area) # 200 r1.func_area = 80 print(r1.__dict__) # {'length': 20, 'width': 10, '_area': 80} del r1.func_area # 将调用 deleter print(r1.__dict__) # {'length': 20, 'width': 10} print(r1.func_area) # 200 print(r1.__dict__) # {'length': 20, 'width': 10, '_area': 200} # r1.func_area = 80 # 报错:ValueError
getter和setter的实战用法
- getter作用:在获取某个属性值(面积)之前想要做别的事情(获取长宽),就给这个属性添加 getter。
- setter作用:在给属性(面积)赋值之前想要做别的事情(不许修改面积,代码中返回ValueError报错),就给这个属性添加 setter。
如何添加getter和setter
getter
在需要添加getter的属性名前加_
(为了代码规范)
定义getter对应的函数
- 需要
@property
装饰器 - 函数名就是不带
_
的属性名 - 函数需要一个返回值(返回属性值)
获取属性的值通过: 对象.
不带_
属性名 (本质就是在调用getter对应的函数来取到属性值也就是函数的返回值)
setter
如果想要给属性添加 setter 必须先给属性添加 getter
先添加 getter
定义setter对应的函数
- 需要 @getter对应的函数名.setter 装饰器
- 函数名就是不带
_
的属性名 - 需要一个参数,不需要返回值,这个参数就是用来给属性赋的值
给属性赋值:对象.
不带_
属性名 = 值 (本质就是在调用setter对应的函数,通过函数的参数对属性进行赋值)
官方给出的规范代码示例
class C: def __init__(self): self._x = "zhangsan" @property def x(self): """I'm the 'x' property.""" return self._x @x.setter def x(self, value): self._x = value @x.deleter def x(self): del self._x if __name__ == '__main__': c = C() # getter print(c.x) # zhangsan print(c.__dict__) # {'_x': 'zhangsan'} # setter c.x = "lisi" print(c.__dict__) # {'_x': 'lisi'} # deleter del c.x print(c.__dict__) # {}
到此这篇关于Python中的getter与setter及deleter使用示例讲解的文章就介绍到这了,更多相关Python getter setter deleter内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!