在大多数语言的程序中,一个类,每有一个属性,就会对应 setter 和 getter,基本都是标配。

示例:

class Money(object):def __init__(self):self.__money = 0def getMoney(self):return self.__moneydef setMoney(self, value):if isinstance(value, int):self.__money = valueelse:print("error:不是整型数字")

设置私有属性的目的就是不想让数据被误取出来,增加一个方法去获取私有属性或者设置私有属性,那么就保证将来想获取属性的时候就获取,想设置的时候还可以进行过滤。

其他语言基本都是这么做的,但是 Python 不推荐。 Python 有 property。

一、什么是property属性

一种用起来像是使用的实例属性一样的特殊属性,可以对应于某个方法。

class Foo:def func(self):pass# 定义property属性@propertydef prop(self):passfoo_obj = Foo()
foo_obj.func()  # 调用实例方法
foo_obj.prop  # 调用property属性

示例:

class Goods:@propertydef size(self):return 100obj = Goods()
ret = obj.size  # 调用属性
print(ret)  # 100

obj.size 会自动地去调用 size 方法,返回 size 方法的返回值。

property属性的定义和调用要注意以下几点:

  • 定义时,在实例方法的基础上添加 @property 装饰器;
  • 仅有一个self参数;
  • 调用时,无需括号。

那 property 属性到底是用来干什么的?下面看一个实例。

对于京东商城中显示电脑主机的列表页面,每次请求不可能把数据库中的所有内容都显示到页面上,而是通过分页的功能局部显示,所以在向数据库中请求数据时就要显示的指定获取从第m条到第n条的所有数据,这个分页的功能包括:

  • 根据用户请求的当前页和总数据条数计算出 m 和 n。
  • 根据m 和 n 去数据库中请求数据。
class Pager:def __init__(self, current_page):# 用户当前请求的页码(第一页、第二页...)self.current_page = current_page# 每页默认显示10条数据self.per_items = 10@propertydef start(self):val = (self.current_page - 1) * self.per_itemsreturn val@propertydef end(self):val = self.current_page * self.per_itemsreturn valp = Pager(1)
p.start  # 就是起始值,即:m
p.end  # 就是结束值,即:n

从上述可见,Python 的 property 属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回。

二、property属性的有两种方式

  • 装饰器 即:在方法上应用装饰器。
  • 类属性 即:在类中定义值为 property 对象的类属性。

1、装饰器方式

在类的实例方法上应用 @property 装饰器。

Python中的类有经典类和新式类,新式类的属性比经典类的属性丰富。( 如果类继object,那么该类是新式类 )

经典类,具有一种 @property 装饰器。

class Goods:@propertydef price(self):return "laowang"obj = Goods()
# 自动执行 @property 修饰的 price 方法,并获取方法的返回值
result = obj.price
print(result)  # laowang

新式类,具有三种@property装饰器。

python3 中默认继承object类,只有在 python3 中才有@xxx.setter @xxx.deleter。

class Goods:@propertydef price(self):print('@property')@price.setterdef price(self, value):print('@price.setter')@price.deleterdef price(self):print('@price.deleter')obj = Goods()
# 自动执行 @property 修饰的 price 方法,并获取方法的返回值
obj.price  # @property
# 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数
obj.price = 123  # @price.setter
# 自动执行 @price.deleter 修饰的 price 方法
del obj.price  # @price.deleter

注意:

  • 经典类中的属性只有一种访问方式,其对应被 @property 修饰的方法。
  • 新式类中的属性有三种访问方式,并分别对应了三个被@property、@方法名.setter、@方法名.deleter修饰的方法。

由于新式类中具有三种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除。

示例:

class Goods(object):def __init__(self):# 原价self.original_price = 100# 折扣self.discount = 0.8@propertydef price(self):# 实际价格 = 原价 * 折扣new_price = self.original_price * self.discountreturn new_price@price.setterdef price(self, value):self.original_price = value@price.deleterdef price(self):del self.original_priceobj = Goods()
obj.price         # 获取商品价格
obj.price = 200   # 修改商品原价
del obj.price     # 删除商品原价

2、类属性方式

创建值为 property 对象的类属性。

当使用类属性的方式创建property属性时,经典类和新式类无区别。

示例:

class Foo:def get_bar(self):return 'laowang'BAR = property(get_bar)obj = Foo()
reuslt = obj.BAR  # 自动调用get_bar方法,并获取方法的返回值
print(reuslt)  # laowang

property方法中有个四个参数

  • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法。
  • 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法。
  • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法。
  • 第四个参数是字符串,调用 对象.属性.__doc__ ,此参数是该属性的描述信息。

示例:

class Foo(object):def get_bar(self):print("getter...")return 'laowang'def set_bar(self, value):"""必须两个参数"""print("setter...")return 'set value' + valuedef del_bar(self):print("deleter...")return 'laowang'BAR = property(get_bar, set_bar, del_bar, "description...")obj = Foo()
# 自动调用第一个参数中定义的方法:get_bar
obj.BAR  # getter...
# 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
obj.BAR = "alex"  # setter...
# 自动获取第四个参数中设置的值:description...
desc = Foo.BAR.__doc__
print(desc)  # description...
# 自动调用第三个参数中定义的方法:del_bar方法
del obj.BAR  # deleter...

由于类属性方式创建 property 属性具有3种访问方式,我们可以根据它们几个属性的访问特点,分别将三个方法定义为对同一个属性:获取、修改、删除。

class Goods(object):def __init__(self):# 原价self.original_price = 100# 折扣self.discount = 0.8def get_price(self):# 实际价格 = 原价 * 折扣new_price = self.original_price * self.discountreturn new_pricedef set_price(self, value):self.original_price = valuedef del_price(self):del self.original_pricePRICE = property(get_price, set_price, del_price, '价格属性描述...')obj = Goods()
obj.PRICE         # 获取商品价格
obj.PRICE = 200   # 修改商品原价
del obj.PRICE     # 删除商品原价

综上所述:

  • 定义property属性共有两种方式,分别是【装饰器】和【类属性】,而【装饰器】方式针对经典类和新式类又有所不同。
  • 通过使用property属性,能够简化调用者在获取数据的流程。

一文详述 Python 中的 property 语法相关推荐

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

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

  2. Python中的property类和@property装饰器

    Python中的property类和@property装饰器 在Python的类中,为了避免使用者直接在类的外部操作属性和方法,我们可以将属性和方法设置成私有属性和私有方法. 如果我们需要访问私有属性 ...

  3. python中的@property装饰器

    引言 本文将要介绍Python中@property装饰器,这是一种python风格的getters和setters方法.Python编程为我们提供了一个内置的@property装饰器,它使面向对象编程 ...

  4. python中的字符串是什么,一文秒懂Python中的字符串

    摘要:本文将告诉您Python中的字符串是什么,并向您简要介绍有关该概念的所有知识. 因此,让我们开始吧. 什么是Python中的字符串? 我们许多熟悉C,C ++等编程语言的人都会得到诸如" ...

  5. Python中常见的语法糖

    Python中常见的语法糖 知识点导航: 1. 横线分隔符 2. 交换两个变量的值 3. 判断变量是否在范围内 4. 字符串的乘法 5. 列表相加 6. 列表切片 7. 解压序列赋值给多个变量 8. ...

  6. Python中的基本语法2

    Python中的基本语法2 一.循环关键字(pass.break.continue) 1.pass 2.break 3.continue 二.for循环 一.循环关键字(pass.break.cont ...

  7. 站长在线Python精讲:Python中正则表达式的语法详解

    欢迎你来到站长在线的站长学堂学习Python知识,本文学习的是<Python中正则表达式的语法详解>.本知识点主要内容有9点:行定位符.元字符.限定符.字符集.排除字符.选择字符.转义字符 ...

  8. Python中通过property实现属性的修改、删除、查看

    1. property的作用 在Python中,属性可以完成赋值.取值.删除的操作.如果我们想要在完成这些操作前,进行属性的校验工作(例如:赋值前判断数据的有效性.删除前判断合法性身份),则需要在方法 ...

  9. 玩转Python!一文详述Python 的高性能使用技巧

    关注上方"深度学习技术前沿",选择"星标公众号", 资源干货,第一时间送达! 作者:张皓 知乎链接:https://zhuanlan.zhihu.com/p/4 ...

  10. python中各种@property、@xxx.setter、@classmethod、@staticmethod 都是些啥啊?

    时不时看到有友友对一些 Python 方法的定义感到疑惑:为啥要在方法上面要各种 @ ? 类似这样: 这是你最常见的几个玩意了吧,它们都是啥意思,以及怎么去定义使用呢? 那么,接下来我就尽量通熟易懂的 ...

最新文章

  1. 解决了无法显示验证码的问题
  2. 基于注解的AOP实现事务控制及问题分析
  3. 如何操作SAP UI5应用Footer区域工具栏按钮的背景颜色
  4. python之禅星号_那些用起来很爽,但用不好可能会被人打的Python骚操作
  5. 家里的活一般是都帮不上忙
  6. JavaScript实现了网页的行为
  7. 微信小程序自定义Modal弹框
  8. Android iTOP-4412全能版 CAN通信集成(完整篇)
  9. MongoDb学习(五)--Gridfs--上传下载
  10. 小米路由器3 mysql_小米路由器3 opkg安装
  11. 靠一颗火锅丸子弯道超车三全,安井到底凭什么?
  12. Win11(Win10类似)的快速设置与优化 ——《环境配置》系列文章
  13. Beyond Compare 4 智能比较工具、Everything 文件/夹搜索工具,WinRAR,7-Zip 解压缩工具、diagrams 流程图工具、Markdown 编辑器-Notable
  14. uniapp 即时通讯_uni-App 仿微信 App 即时通讯|vue+uniapp 聊天
  15. 日本一网友买煤炭自杀
  16. 开源OA协同办公平台搭建教程丨服务器端命令:数据导入导出及配置
  17. 云原生运行时的下一个五年
  18. 走近“so,neither”开头的倒装句
  19. win7硬件要求_九代酷睿平台装Win7的方法!2019年九代i5-9400F配B365装机配置单
  20. C++常用数据结构总结

热门文章

  1. (vue)h5 通过高德地图(原生) 获取当前位置定位
  2. MSU转Uniprot转Entrez ID
  3. 如果别人出生就在罗马,那我只能更努力,两年半拿到字节跳动Offer
  4. 微信朋友圈会在服务器上保留多久,微信朋友圈有没有草稿?可以存多久?
  5. excel 电阻并联计算_多个电阻并联公式 三个电阻并联公式
  6. Windows系统下的mklink指令
  7. 中文文本分类-新闻分类[数据挖掘]
  8. PD快充协议JD6606S资料
  9. 基于深度学习时间序列分类研究综述[论文阅读]
  10. Latex 中文使用方法和示例——分别基于MiKTeX(CTeX套装)、TeXLive 编译系统测试CJK、ctex 宏包,PDFLaTeX、XeLaTeX编译命令及GBK、UTF-8文件编码的使用