Python中的getter与setter及deleter使用示例讲解

 更新时间:2023年01月12日 08:55:52   作者:Jenrey  
这篇文章主要介绍了Python中的getter与setter及deleter使用方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧

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

我们需要写一个方法计算矩形的面积。

原始代码

"""__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修饰的函数名一样。

官方文档关于@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内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • Python selenium 父子、兄弟、相邻节点定位方式详解

    Python selenium 父子、兄弟、相邻节点定位方式详解

    这篇文章主要介绍了Python selenium 父子、兄弟、相邻节点定位方式详解的相关资料,非常不错,具有参考借鉴价值,需要的朋友可以参考下
    2016-09-09
  • 基于PyTorch中view的用法说明

    基于PyTorch中view的用法说明

    这篇文章主要介绍了基于PyTorch中view的用法说明,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2021-03-03
  • 一文详解Django信号机制的工作原理

    一文详解Django信号机制的工作原理

    Django 信号(signals)是一种实现解耦的有力工具,它允许某些发生的事件通知其他部分的代码,本文将深入探讨 Django 信号的工作原理、如何定义和接收信号,以及如何在项目中有效地使用它们,需要的朋友可以参考下
    2023-11-11
  • Windows下Anaconda和PyCharm的安装与使用详解

    Windows下Anaconda和PyCharm的安装与使用详解

    这篇文章主要介绍了Windows下Anaconda和PyCharm的安装与使用详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-04-04
  • 22个Python的万用公式分享

    22个Python的万用公式分享

    在大家的日常python程序的编写过程中,都会有自己解决某个问题的解决办法,或者是在程序的调试过程中,用来帮助调试的程序公式。小编通过几十万行代码的总结处理,总结出了22个python万用公式,可以帮助大家解决在日常的python编程中遇到的大多数问题,一起来看看吧
    2022-12-12
  • Python操作excel文件与csv文件方法详解

    Python操作excel文件与csv文件方法详解

    这篇文章主要介绍了Python操作excel文件与csv文件方法,csv文件可以直接通过excel打开,以行列保存显示文件,相比与excel来说它只能保存数据,不能保存公式和函数,然而python处理两种文件的方式大同小异,感兴趣的朋友可以参考下
    2023-12-12
  • Django的性能优化实现解析

    Django的性能优化实现解析

    这篇文章主要介绍了Django的性能优化实现解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-07-07
  • pycharm安装深度学习pytorch的d2l包失败问题解决

    pycharm安装深度学习pytorch的d2l包失败问题解决

    当新生在学习pytorch时,导入d2l_pytorch包总会遇到问题,下面这篇文章主要给大家介绍了关于pycharm安装深度学习pytorch的d2l包失败问题的解决方法,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
    2022-03-03
  • python学习之hook钩子的原理和使用

    python学习之hook钩子的原理和使用

    这篇文章主要为大家详细介绍了python学习之hook钩子的原理和使用,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • python数学建模之Matplotlib 实现图片绘制

    python数学建模之Matplotlib 实现图片绘制

    这篇文章主要介绍了python数学建模之Matplotlib 实现图片绘制,文章围绕主题展开详细的内容介绍,具有一定的参考价值,需要的小伙伴可以参考一下
    2022-07-07

最新评论