假如我们需要写一个矩形的类,对象属性包括矩形的长和宽。
我们需要写一个方法计算矩形的面积。
那么问题是:我们如何实现计算矩形的面积?先看如下代码:
#定义类
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 = 10
print(r1.area) #100
#修改矩形长度以达到修改矩形面积的效果
r1.length = 10
print(r1.area) #100
以上代码实现了给出长宽计算面积的功能。但是,也可以在不修改长宽的情况下直接修改面积的值,很明显是不切合实际的。而且,我们通过修改长宽的值,面积也没有跟着改变。
这种情况下,我们就需要用到Python中的 getter 和 setter来帮我们实现该功能了。
下面是修改以后的代码:
class Rect:
def __init__(self, length=0, width=0):
self.length = length
self.width = width
self._area = length*width #在需要添加getter的属性名前加_
#第二步:定义getter对应的函数
@property #需要@property装饰器
def area(self): #函数名就是不带_的属性名
print('area属性值被获取')
self._area = self.width * self.length #获取属性的值:width和length前不用加_
return self._area #函数需要一个返回值
@area.setter #需要 @getter函数名.setter 装饰器
def area(self, value): #函数名就是不带_的属性名
raise ValueError
r1 = Rect(4, 5)
print(r1.area) #20
r1.width = 10
print(r1.area) #40
r1.length = 10
print(r1.area) #100
r1.area = 80 #报错:ValueError
一、getter 和 setter 的作用
- getter作用:在获取某个属性值(面积)之前想要做别的事情(获取长宽),就给这个属性添加 getter。
- setter作用:在给属性(面积)赋值之前想要做别的事情(不许修改面积),就给这个属性添加 setter。
二、如何添加 getter 和 setter
getter
第一步:在需要添加getter的属性名前加_
第二步:定义getter对应的函数(1.需要@property装饰器 2.函数名就是不带_的属性名 3.函数需要一个返回值)
第三步:获取属性的值通过: 对象.不带_属性名 (本质就是在调用getter对应的函数,取到属性值就是函数的返回值)setter
如果想要给属性添加 setter 必须先给属性添加 getter
第一步:添加 getter
第二步:定义 setter 对应的函数 (1.需要 @getter函数名.setter 装饰器 2.函数名就是不带_的属性名 3.需要一个参数不需要返回值,这个参数就是尝试给属性赋的值)
第三步:给属性赋值:对象.不带_属性名 = 值 (本质就是在调用setter对应的函数)