我的编程空间,编程开发者的网络收藏夹
学习永远不晚

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

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

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

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

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

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

Python中的getter和setter的方法使用详解

基本上,在面向对象编程语言中,使用setter和getter方法的主要目的是为了确保数据的封装,这篇文章主要介绍了Python的getter和setter的方法使用详解,需要的朋友可以参考下
2022-12-08

Python中 join() 函数的使用示例讲解

Python中有join()和os.path.join()两个函数,这篇文章主要介绍了Python中 join() 函数的使用方法,需要的朋友可以参考下
2023-05-14

举例讲解Python中metaclass元类的创建与使用

元类是可以让你定义某些类是如何被创建的。从根本上说,赋予你如何创建类的控制权。 元类也是一个类,是一个type类。元类一般用于创建类。在执行类定义时,解释器必须要知道这个类的正确的元类,如果此属性没有定义,它会向上查找父类中的__metac
2022-06-04

C++前缀和与差分的使用示例讲解

前缀和是指某序列的前n项和,可以把它理解为数学上的数列的前n项和,而差分可以看成前缀和的逆运算。合理的使用前缀和与差分,可以将某些复杂的问题简单化。类似于数学中的求导和积分,差分可以看成前缀和的逆运算
2023-03-09

python中 \r 与end=‘’ 的使用示例

这篇文章主要介绍python中 \r 与end=‘’ 的使用示例,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!Python主要用来做什么Python主要应用于:1、Web开发;2、数据科学研究;3、网络爬虫;4、嵌入
2023-06-14

实例讲解Python中函数的调用与定义

调用函数:#!/usr/bin/env python3 # -*- coding: utf-8 -*- # 函数调用 >>> abs(100) 100 >>> abs(-110) 110 >>> abs(12.34) 12.3
2022-06-04

python中API调用的详解与示例

本篇文章给大家带来了关于python的相关知识,其中主要介绍了关于API调用的相关问题,包括了API的调用和数据接口的调用、请求方法、几种常见API调用实例等等内容,下面一起来看一下,希望对大家有帮助。在日常工作中,可能需要结合网上现在的一些API或者公司提供的数据接口来得到相应的数据或者实现对应的功能。 因此API的调用和数据接口的访问都是做数据分析的一个常用操作,如何快速实现API和数据接口的调
2022-06-16

Python中Merge使用的示例详解

Python里的merger函数是数据分析工作中最常见的函数之一,类似于MySQL中的join函数和Excel中的vlookup函数。本文将通过一些简单的实力和大家聊聊Merge的使用,需要的可以了解一下
2023-02-21

Kotlin示例讲解标准函数with与run和apply的使用

Kotlin的标准函数是指Standard.kt文件中定义的函数,任何Kotlin代码都可以自由地调用所有的标准函数。文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习吧
2022-11-13

详解Python定时器Timer的使用及示例

这篇文章主要介绍了详解Python定时器的使用及示例,Timer定时器源码实现,和自定义一个线程方式一样,都是继承Thread类,重写了run()方法,只是实现的功能是延时执行一个函数或方法,需要的朋友可以参考下
2023-05-19

举例讲解Python编程中对线程锁的使用

锁 python的内置数据结构比如列表和字典等是线程安全的,但是简单数据类型比如整数和浮点数则不是线程安全的,要这些简单数据类型的通过操作,就需要使用锁。#!/usr/bin/env python3 # coding=utf-8import
2022-06-04

举例讲解Python中的身份运算符的使用方法

Python身份运算符 身份运算符用于比较两个对象的存储单元以下实例演示了Python所有身份运算符的操作:#!/usr/bin/pythona = 20 b = 20if ( a is b ):print "Line 1 - a and
2022-06-04

Zookeeper原理及在Dubbo中的使用示例详解

这篇文章主要为大家介绍了Zookeeper原理及在Dubbo中的使用示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-03-19

实例讲解Android app开发中ListView的基本使用及优化

一、直接使用ListView组件创建 1.直接在XML中创建ListView用entries属性附上一个数组资源 其中divider属性是设置分割线可以使用颜色和drawable资源分割
2022-06-06

举例讲解Python中的迭代器、生成器与列表解析用法

迭代器:初探 上一章曾经提到过,其实for循环是可用于任何可迭代的对象上的。实际上,对Python中所有会从左至右扫描对象的迭代工具而言都是如此,这些迭代工具包括了for循环、列表解析、in成员关系测试以及map内置函数等。 “可迭代对象”
2022-06-04

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录