Python中 getter 和 setter

假如我们需要写一个矩形的类,对象属性包括矩形的长和宽。
我们需要写一个方法计算矩形的面积。

那么问题是:我们如何实现计算矩形的面积?先看如下代码:

#定义类
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

  1. getter
    第一步:在需要添加getter的属性名前加_
    第二步:定义getter对应的函数(1.需要@property装饰器 2.函数名就是不带_的属性名 3.函数需要一个返回值)
    第三步:获取属性的值通过: 对象.不带_属性名 (本质就是在调用getter对应的函数,取到属性值就是函数的返回值)

  2. setter
    如果想要给属性添加 setter 必须先给属性添加 getter
    第一步:添加 getter
    第二步:定义 setter 对应的函数 (1.需要 @getter函数名.setter 装饰器 2.函数名就是不带_的属性名 3.需要一个参数不需要返回值,这个参数就是尝试给属性赋的值)
    第三步:给属性赋值:对象.不带_属性名 = 值 (本质就是在调用setter对应的函数)

你可能感兴趣的:(Python中 getter 和 setter)