一、什么是 property特性

  • property装饰器用于将被装饰的方法伪装成一个数据属性,在使用时可以不用加括号而直接使用
# ############### 定义 ###############
class Foo:def func(self):pass# 定义property属性@propertydef prop(self):pass# ############### 调用 ###############
foo_obj = Foo()
foo_obj.func()  # 调用实例方法
foo_obj.prop  # 调用property属性

如下的例子用于说明如何定一个简单的property属性:

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Goods(object):@propertydef size(self):return 100g = Goods()
print(g.size)
100

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

\1. 定义时,在实例方法的基础上添加 @property 装饰器;并且仅有一个self参数

\2. 调用时,无需括号

二、简单示例

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

  1. 根据用户请求的当前页和总数据条数计算出 m 和 n
  2. 根据m 和 n 去数据库中请求数据
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# ############### 定义 ###############
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 val# ############### 调用 ###############
p = Pager(1)
print(p.start)  # 就是起始值,即:m
0
print(p.end)  # 就是结束值,即:n
10

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

三、 property属性的两种方式

  1. 装饰器 即:在方法上应用装饰器(推荐使用)
  2. 类属性 即:在类中定义值为property对象的类属性(Python2历史遗留)

3.1 装饰器

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

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

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
# ############### 定义 ###############
class Goods:@propertydef price(self):return "laowang"# ############### 调用 ###############
obj = Goods()
result = obj.price  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
print(result)
laowang

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#coding=utf-8
# ############### 定义 ###############
class Goods:"""python3中默认继承object类以python2、3执行此程序的结果不同,因为只有在python3中才有@xxx.setter  @xxx.deleter"""@propertydef price(self):print('@property')@price.setterdef price(self, value):print('@price.setter')@price.deleterdef price(self):print('@price.deleter')# ############### 调用 ###############
obj = Goods()
obj.price  # 自动执行 @property 修饰的 price 方法,并获取方法的返回值
@property
obj.price = 123  # 自动执行 @price.setter 修饰的 price 方法,并将  123 赋值给方法的参数
@price.setter
del obj.price  # 自动执行 @price.deleter 修饰的 price 方法
@price.deleter

注意:

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

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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):print('del')del self.original_priceobj = Goods()
print(obj.price)  # 获取商品价格
80.0
obj.price = 200  # 修改商品原价
print(obj.price)
160.0
del obj.price  # 删除商品原价
del

3.2 类属性方式

创建值为property对象的类属性

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class Foo:def get_bar(self):return 'laowang'BAR = property(get_bar)obj = Foo()
reuslt = obj.BAR  # 自动调用get_bar方法,并获取方法的返回值
print(reuslt)
laowang

property方法中有个四个参数

  1. 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
  2. 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
  3. 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
  4. 第四个参数是字符串,调用 对象.属性.doc ,此参数是该属性的描述信息
'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
#coding=utf-8
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()obj.BAR  # 自动调用第一个参数中定义的方法:get_bar
getter...'laowang'
obj.BAR = "alex"  # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
setter...
desc = Foo.BAR.__doc__  # 自动获取第四个参数中设置的值:description...
print(desc)
description...
del obj.BAR  # 自动调用第三个参数中定义的方法:del_bar方法
deleter...

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

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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  # 获取商品价格
80.0
obj.PRICE = 200  # 修改商品原价
print(obj.PRICE)
160.0
del obj.PRICE  # 删除商品原价

综上所述:

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

四、property+类的封装

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
class People:def __init__(self, name):self.__name = name@property  # 查看obj.namedef name(self):return '<名字是:%s>' % self.__namepeo1 = People('nick')
print(peo1.name)
<名字是:nick>
try:peo1.name = 'EGON'
except Exception as e:print(e)
can't set attribute

五、应用

5.1 私有属性添加getter和setter方法

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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:不是整型数字")

5.2 使用property升级getter和setter方法

'''
遇到问题没人解答?小编创建了一个Python学习交流QQ群:857662006
寻找有志同道合的小伙伴,互帮互助,群里还有不错的视频学习教程和PDF电子书!
'''
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:不是整型数字")# 定义一个属性,当对这个money设置值时调用setMoney,当获取值时调用getMoneymoney = property(getMoney, setMoney)a = Money()
a.money = 100  # 调用setMoney方法
print(a.money)  # 调用getMoney方法
100

5.3 使用property取代getter和setter方法

重新实现一个属性的设置和读取方法,可做边界判定


class Money(object):def __init__(self):self.__money = 0# 使用装饰器对money进行装饰,那么会自动添加一个叫money的属性,当调用获取money的值时,调用装饰的方法@propertydef money(self):return self.__money# 使用装饰器对money进行装饰,当对money设置值时,调用装饰的方法@money.setterdef money(self, value):if isinstance(value, int):self.__money = valueelse:print("error:不是整型数字")a = Money()
a.money = 100
print(a.money)
100

Python基础教程:类的property特性相关推荐

  1. python 基础教程:对 property 属性的讲解及用法

    Python中property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回 property属性的有两种方式: 装饰器 即:在方法上应用装饰器 类属性 即:在类中定义 ...

  2. python基础教程pdf百度云-《Python基础教程(第3版)》PDF高清版

    <python基础教程第3版>PDF高清版  百度云资源,内涵教材源代码 百度云链接:百度云盘 提取码:7r7o 编辑推荐 久负盛名的Python入门经典,是非常优秀的基础教程,深入浅出, ...

  3. python基础教程-《Python基础教程(第3版)》PDF高清版

    <python基础教程第3版>PDF高清版  百度云资源,内涵教材源代码 百度云链接:百度云盘 提取码:7r7o 编辑推荐 久负盛名的Python入门经典,是非常优秀的基础教程,深入浅出, ...

  4. python基本代码教程-Python基础教程(第3版)

    Python基础教程(第3版) 第2版前言 第1版前言 引言 1 快速上手:基础知识 1.1 交互式解释器 1.2 算法是什么 1.3 数和表达式 十六进制.八进制和二进制 1.4 变量 1.5 语句 ...

  5. python基础教程免费下载-Python基础教程(第2版)

    <Python基础教程(第2版)>内容涉及的范围较广,既能为初学者夯实基础,又能帮助程序员提升技能,适合各个层次的Python开发人员阅读参考.<Python基础教程(第2版)> ...

  6. python黑马教程ppt_,python基础教程 PPT

    python基础教程 PPT Python我这里有Python编开发,进阶,化,实战等系列视频教程,还有安装包,素材,代码内容,这里就不一一说了,全套内容一共300G左右,非常的详细,需要的请到网盘下 ...

  7. python基础教程免费下载-Python基础教程第三版PDF电子书免费下载

    <Python基础教程(第3版)>是2018年人民邮电出版社出版的图书,作者是[挪]Magnus Lie Hetland.该书全面介绍了Python的基础知识和基本概念,包括列表.元组.字 ...

  8. Python 基础教程(第二版)读书笔记

    Python 基础教程(第二版) 第一章 在 Python 3 中可直接使用长整数,而不必添加 L 或者 l 的后缀. print在 Python 3 中是函数. 在交互式解释器中使用 if 语句,需 ...

  9. python基础教程目录-Python基础教程(第2版 修订版) 简介,目录书摘

    编辑推荐: <Python基础教程(第2版·修订版)>是经典的Python入门教程,层次鲜明,结构严谨,内容翔实,特别是最后几章,作者将前面讲述的内容应用到10个引人入胜的项目中,并以模板 ...

  10. python基础教程书籍推荐-入门python有什么好的书籍推荐?

    Python编程语言有许多语法结构.标准库函数和交互式开发环境功能.好在,你可以忽略大多数内容.你只需要学习部分内容,就能编写一些方便的小程序. 但在动手之前,你必须学习一些基本编程概念.就像魔法师培 ...

最新文章

  1. 基于tiny4412的Linux内核移植 -- eMMC驱动移植(六)
  2. 详解 WebRTC 高音质低延时的背后 — AGC
  3. 2021金蝶全球创见者大会成功举办, 500强企业共话EBC数字战斗力
  4. Linux中英文命令对应
  5. 太难了!线下教培受重创,这家企业无奈宣布全员工资3.5折5个月
  6. 开发 面试_农行软件开发中心实习面试
  7. express日常开发总结
  8. 跟着团子学SAP—SAP LTMC基础教程(物料主数据导入示例)
  9. netkeeper客户端_Netkeeper校园客户端(创翼客户端)下载
  10. ImDisk 命令行用法
  11. 巨量引擎api对接 php,巨量引擎Marketing API 现已开放多种创意能力接口
  12. matlab实现单峰物体复原--光栅投影-多频外差
  13. 一键下载QQ空间相册,微博相册,知乎回答图片,豆瓣图片,instagram图片
  14. zbbz cnk
  15. 写给想学Linux系统的人
  16. Vue-全局websocket 实现消息推送
  17. leetcode:13、罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
  18. 华硕x450jn拆机_华硕X450JN笔记本拆机升级SSD,影驰ONE120固态硬盘上手
  19. HTML thead 标签
  20. HDU-2549 壮志难酬

热门文章

  1. 改善EF代码的方法(下)
  2. jQuery 1.10.0 和 2.0.1 发布
  3. 第10章 常用功能及函数集;客户端IP地址
  4. 逻辑判断 java_写 JS 逻辑判断,不要只知道用 if-else 和 switch
  5. linux中menu命令,menucofig 详解
  6. python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...
  7. 【MM模块】ERS and Invoicing Plans 发票计划
  8. 【PP】长交期计划(LTP)简介
  9. 【PP操作手册】运行MRP产生计划订单
  10. 售达方、送达方的区别