本文主要内容:

  1. 解释setter和getter的使用方法
  2. 解释@property装饰器的妙用

    在python中,setter和getter方法并不像其它编程语言中的那样。基本上,在面向对象编程语言中,使用setter和getter方法的主要目的是为了确保数据的封装。不像其它面向对象编程语言,python中的私有变量并不是真正的隐藏字段。在python中,通常在以下情况会用到setter和getter方法:

  • 在获取或者设置属性值的时候使用setter和getter方法为其添加验证逻辑
  • 避免对类的某些字段直接访问,比如类的私有变量不应该被外部调用者直击访问或者修改

使用普通函数实现setter和getter方法
要实现setter和getter属性,只是定义普通方法get()和set()并不能反产生任何特殊的行为,例如:

class Student(object):def __int(self, age=0):self._age = age# getter方法def get(self):return self._age# setter方法def set(self, value):self._age = valuexiaoming = Student()
# 使用setter方法设置age
xiaoming.set(20)
# 使用getter方法返回age
print(xiaoming.get())
print(xiaoming._age)

输出:

20
20

在上面代码中,set_age()和get_age()方法与普通方法并没有什么两样,那么如何实现像getter和setter一样的功能呢?这就要用到python中的特殊方法property()。

使用property()方法来实现setter和getter的行为
property()是python中的一个内置方法,它创建并返回一个属性对象。一个属性对象有三个方法,getter()、setter()和delete()。property()内置方法有四个参数,property(fget,fset, fdel, doc)。fget是一个用于获取属性值的函数,fset是一个用于设置属性值的函数,fdel是一个用于删除属性的函数,doc用于为属性创建文档说明。一个属性兑现有三个方法,getter()、setter()和delete()分别制定fget、fset、fdel。

class Adult(object):def __int(self):self.__age = 0# 获取属性_age的值def get_age(self):print('getter() method called')return self.__age# 设置属性_age的值def set_age(self, value):print('setter() method called')self.__age = value# 删除属性_agedef del_age(self):del self.__ageage = property(get_age, set_age, del_age)laowang = Adult()
laowang.age = 60
print(laowang.age)

输出:

setter() method called
getter() method called
60

在上面的代码中,age就是一个属性对象,它保证了对私有变量的安全访问。

使用@property装饰器来实现setter和getter的行为
除了上面使用property()的方法来实现getter、setter方法的行为,在python中还可以装饰器@property来实现。@property是python的一个内置装饰器,使用装饰器的目的是改变类的方法或者属性,这样调用者就无需在代码中做任何改动。

class Adult(object):    def __init__(self):self.__age = 0@propertydef age(self):print('getter() method called')return self.__age@age.setterdef age(self, value):if value < 18:raise ValueError('Sorry, you are a child, games not allowed')print('setter() method called')self.__age = valuexiaoli = Adult()
xiaoli.age = 19
print(xiaoli.age)

输出:

setter() method called
getter() method called
19

上面的代码清晰地展示了如何用pythonic的方式使用@property装饰器实现setter和getter属性。同时实现了对属性赋值时的有效性检查。

Python的getter和setter的方法使用详解相关推荐

  1. python装饰器函数-Python函数装饰器常见使用方法实例详解

    本文实例讲述了Python函数装饰器常见使用方法.分享给大家供大家参考,具体如下: 一.装饰器 首先,我们要了解到什么是开放封闭式原则? 软件一旦上线后,对修改源代码是封闭的,对功能的扩张是开放的,所 ...

  2. Python生成器next方法和send方法区别详解

    yield的语法规则是: 在yield这里暂停函数执行,并返回yield后面表达式的值(默认为None),直到被next()再次调用时,从上次暂停的yield代码处继续往下执行.当没有可继续next( ...

  3. python怎么画条形图-python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...

  4. python的socket模块_Python socket模块方法实现详解

    这篇文章主要介绍了python socket模块方法实现详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 socket ssh (不带防止粘包的方 ...

  5. python中列表的sort方法_python中列表的sort方法使用详解

    内容简介:python中列表的sort方法使用详解 一.基本形式 列表有自己的sort方法,其对列表进行原址排序,既然是原址排序,那显然元组不可能拥有这种方法,因为元组是不可修改的. 排序,数字.字符 ...

  6. python中new方法详解及_Python中new方法的详解

    new_ 方法是什么? __new__方法其实就是创建对象的方法 new()方法是在类准备将自身实例化时调用. 一个类可以有多个位置参数和多个命名参数,而在实例化开始之后,在调用 init()方法之前 ...

  7. python画条形图-python绘制条形图方法代码详解

    1.首先要绘制一个简单的条形图 import numpy as np import matplotlib.pyplot as plt from matplotlib import mlab from ...

  8. python中sort函数字符串_python中的sort方法使用详解

    < Python树莓派编程>--3.3 Python入门 本节书摘来自华章出版社<Python树莓派编程>一书中的第3章,第3.3节,作者:[美]沃尔弗拉姆·多纳特(Wolfr ...

  9. 如何在python制作计算器_Python简易计算器制作方法代码详解

    主要用到的工具是Python中的Tkinter库 比较简单 直接上图形界面和代码 引用Tkinter库 from tkinter import * 建立主窗口对象 window=Tk() #设置窗口对 ...

最新文章

  1. 实现单机五子棋,难吗?
  2. 5、删除被其它表关联的主表
  3. 事编计算机网络管理专技如何评级,事业单位管理和专技岗位有什么区别?哪个有前途?...
  4. JAVASCRIPT常用20种小技巧汇总
  5. CV新赛事|CT影像诊断新冠肺炎北京垃圾分类识别~文末有福利
  6. bat执行java文件_.bat文件执行java程序
  7. jxl freemark
  8. BusyBox 中添加新命令
  9. IIS 配置详解 请求长度限制调整
  10. python系统学习:第三周之文件操作
  11. 12月21诛仙服务器维护,12月24日全服停机更新维护公告
  12. MARIADB数据库服务器
  13. 怎么用计算机测出来体脂,如何测自己的体脂率?
  14. sql语句中的right函数
  15. 【算法编程】乘方取模
  16. SDN网络的工作原理
  17. Ronald Van Loon/Greg White带你领略Hadoop/Spark大数据CCA175认证(一)
  18. 输入框内只能输入数字,输入其他内容不显示
  19. 3.8 JS 制作无间断图片循环滚动效果
  20. 如何一键解决图片无损放大

热门文章

  1. Jenkins持续集成安卓 Android
  2. 2018.10.29 bzoj1023: [SHOI2008]cactus仙人掌图(仙人掌+单调队列优化dp)
  3. 【戒烟】戒烟49天【纪念】
  4. TMS320C6748开发视频教程笔记 第9章 中断与异常
  5. 表单序列化后得不到值
  6. python实现网页注册登录_Python+django网页设计入门(5):自定义用户注册与登录功能...
  7. 用指针法对10个整数排序
  8. 安全帽检测(yolov5+tnn)
  9. 华为手机用显示服务器超时,手机服务器超时
  10. 机器学习---文本特征提取之词袋模型与tfidf特征