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

原始代码

"""__dict__属性:查看对象内部所有属性名和属性值组成的字典
在Python类的内部,无论是类属性还是实例属性,都是以字典的形式进行存储的,其中属性名作为键,而值作为该键对应的值。
"""# 定义类
class Rect:# 定义属性def __init__(self, length=0, width=0):self.length = lengthself.width = widthself.area = length * width# 定义方法def area(self):self.area = self.width * self.lengthreturn 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 = lengthself.width = widthself._area = length * width  # 为了规范需要设置成保护成员属性# 定义getter对应的函数@property  # 需要@property装饰器def func_area(self):print("重新计算面积并赋值")self._area = self.width * self.lengthreturn 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.deleterdef func_area(self):del self._arear1 = Rect(4, 5)
print(r1.func_area)  # 20r1.width = 10
print(r1.func_area)  # 40r1.length = 20
print(r1.func_area)  # 200r1.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

    1. 在需要添加getter的属性名前加_(为了代码规范)
    2. 定义getter对应的函数
      1. 需要@property装饰器
      2. 函数名就是不带_的属性名
      3. 函数需要一个返回值(返回属性值)
    3. 获取属性的值通过: 对象.不带_属性名 (本质就是在调用getter对应的函数来取到属性值也就是函数的返回值)
  • setter
    如果想要给属性添加 setter 必须先给属性添加 getter

    1. 先添加 getter
    2. 定义 setter 对应的函数
      1. 需要 @getter对应的函数名.setter 装饰器
      2. 函数名就是不带_的属性名
      3. 需要一个参数,不需要返回值,这个参数就是用来给属性赋的值
    3. 给属性赋值:对象.不带_属性名 = 值 (本质就是在调用setter对应的函数,通过函数的参数对属性进行赋值)

官方给出的规范代码示例

class C:def __init__(self):self._x = "zhangsan"@propertydef x(self):"""I'm the 'x' property."""return self._x@x.setterdef x(self, value):self._x = value@x.deleterdef x(self):del self._xif __name__ == '__main__':c = C()# getterprint(c.x)  # zhangsanprint(c.__dict__)  # {'_x': 'zhangsan'}# setterc.x = "lisi"print(c.__dict__)  # {'_x': 'lisi'}# deleterdel c.xprint(c.__dict__)  # {}

Python中的getter、setter、deleter相关推荐

  1. python中的getter与setter

    前言 因为java开发的习惯,想要在python开发中使用类似JavaBean的结构. 复制型编写 在python可以直接结合java中的编写习惯编写getter和setter方法.下方是一个示例: ...

  2. javascript 中的getter,setter

    1.什么是getter,什么是setter? getter 是一种获得属性值的方法,setter是一种设置属性值的方法. 2.怎么定义? 有2种办法: 在对象初始化的时候定义 在对象定义后的时候定义 ...

  3. python装饰器 property_python中property和setter装饰器用法

    作用:调用方法改为调用对象, 比如 : p.set_name() 改为 p.set_name 区别:前者改变get方法,后者改变set方法 效果图: 代码: class Person: def __i ...

  4. python 中decorator和property

    1.装饰器decorator 实质是一个迭代器,把定义的函数作为一个属性来调用.具体来看: def hello(fn):print(1)def wrapper():print(2)print(&quo ...

  5. python中装饰器的作用_Python装饰器详解,详细介绍它的应用场景

    装饰器的应用场景附加功能 数据的清理或添加:函数参数类型验证 @require_ints 类似请求前拦截数据格式转换 将函数返回字典改为 JSON/YAML 类似响应后篡改为函数提供额外的数据 moc ...

  6. 第7.26节 Python中的@property装饰器定义属性访问方法getter、setter、deleter 详解

    第7.26节 Python中的@property装饰器定义属性访问方法getter.setter.deleter 详解 一.    引言 Python中的装饰器在前面接触过,老猿还没有深入展开介绍装饰 ...

  7. 第8.27节 Python中__getattribute__与property的fget、@property装饰器getter关系深入解析

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  8. python使用@property @x.setter @x.deleter

    @property可以将python定义的函数"当做"属性访问,从而提供更加友好访问方式,但是有时候setter/deleter也是需要的. 只有@property表示只读. 同时 ...

  9. ES6新特性_ES6语法糖-class中的getter和setter设置---JavaScript_ECMAScript_ES6-ES11新特性工作笔记038

    我们来看一下这个class中的getter和setter这个,在java中也用对吧, 很简单. 看一下我们给Phone类添加一个get price(){} 这个表示我给price属性,添加了一个get ...

最新文章

  1. ethernet调试工具_开发者分享 | 如何调试10G/25G以太网IP自协商/Link Training
  2. 抗锯齿_电竞屏+AI抗锯齿,雷神911 Pro游戏本给你更好游戏体验
  3. c语言数组特殊初始化方法
  4. sql和mysql同时配置_jfinal同时配置mssql和mysql混动数据源
  5. mysql在windows配置多节点_Windows环境配置MySQL集群
  6. 安卓EventBus的使用方法
  7. 解压 .solitairetheme8 文件
  8. Visual Studio + VAssistX常用快捷键收藏
  9. cass生成曲线要素_CASS菜鸟入门指南-道路断面
  10. php 注销session_php中如何删除和销毁Session
  11. MIUI12国际版、欧版、波兰版、国内开发板刷机排雷现场
  12. android 连接魅族调试,魅族Flyme手机无法连接电脑ADB调试
  13. 电路逻辑门图形符号汇总
  14. qq自定义diy名片代码复制_免root安卓版QQ自定义在线 卡iPhone 12 Pro Max,卡5G,6G在线等状态...
  15. python在条件表达式中不允许使用_在条件表达式中不允许使用赋值运算符 = ,会提示语法错误。...
  16. 批量删除html 超链接,Excel中批量删除超链接的方法
  17. IE浏览器访问出现Automation 服务器不能创建对象
  18. 因疫情影响,传苹果下一代iPhone发布将推后一个月
  19. Echars象形图、3D柱状图基本实现
  20. svm+特征提取做分类

热门文章

  1. finalcut剪切快捷键_Final Cut Pro X常用快捷键大全 FCPX快捷键
  2. web前端大作业--响应式风景旅游网页设计(国庆旅游主题-HTML+CSS+JavaScript)实现
  3. c语言中什么随机存取,C语言中对文件的随机存取
  4. 运行java命令出现 Error: Invalid or corrupt jarfile XXX.jar
  5. 别把白内障拖成青光眼,不可逆的致盲眼病最可怕!
  6. 半年卖出4.6亿只粽子,老字号的“想象空间”有多大?
  7. 机器学习工程师与研究员之间的7个主要区别(包括薪水)
  8. access排名_在Microsoft Access中对行进行排名
  9. Error: Unable to access jarfile xxx.jar
  10. 关于Salesforce里的Trigger