Python基础教程:类的property特性
一、什么是 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条的所有数据 这个分页的功能包括:
- 根据用户请求的当前页和总数据条数计算出 m 和 n
- 根据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属性的两种方式
- 装饰器 即:在方法上应用装饰器(推荐使用)
- 类属性 即:在类中定义值为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方法中有个四个参数
- 第一个参数是方法名,调用 对象.属性 时自动触发执行方法
- 第二个参数是方法名,调用 对象.属性 = XXX 时自动触发执行方法
- 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法
- 第四个参数是字符串,调用 对象.属性.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特性相关推荐
- python 基础教程:对 property 属性的讲解及用法
Python中property属性的功能是:property属性内部进行一系列的逻辑计算,最终将计算结果返回 property属性的有两种方式: 装饰器 即:在方法上应用装饰器 类属性 即:在类中定义 ...
- python基础教程pdf百度云-《Python基础教程(第3版)》PDF高清版
<python基础教程第3版>PDF高清版 百度云资源,内涵教材源代码 百度云链接:百度云盘 提取码:7r7o 编辑推荐 久负盛名的Python入门经典,是非常优秀的基础教程,深入浅出, ...
- python基础教程-《Python基础教程(第3版)》PDF高清版
<python基础教程第3版>PDF高清版 百度云资源,内涵教材源代码 百度云链接:百度云盘 提取码:7r7o 编辑推荐 久负盛名的Python入门经典,是非常优秀的基础教程,深入浅出, ...
- python基本代码教程-Python基础教程(第3版)
Python基础教程(第3版) 第2版前言 第1版前言 引言 1 快速上手:基础知识 1.1 交互式解释器 1.2 算法是什么 1.3 数和表达式 十六进制.八进制和二进制 1.4 变量 1.5 语句 ...
- python基础教程免费下载-Python基础教程(第2版)
<Python基础教程(第2版)>内容涉及的范围较广,既能为初学者夯实基础,又能帮助程序员提升技能,适合各个层次的Python开发人员阅读参考.<Python基础教程(第2版)> ...
- python黑马教程ppt_,python基础教程 PPT
python基础教程 PPT Python我这里有Python编开发,进阶,化,实战等系列视频教程,还有安装包,素材,代码内容,这里就不一一说了,全套内容一共300G左右,非常的详细,需要的请到网盘下 ...
- python基础教程免费下载-Python基础教程第三版PDF电子书免费下载
<Python基础教程(第3版)>是2018年人民邮电出版社出版的图书,作者是[挪]Magnus Lie Hetland.该书全面介绍了Python的基础知识和基本概念,包括列表.元组.字 ...
- Python 基础教程(第二版)读书笔记
Python 基础教程(第二版) 第一章 在 Python 3 中可直接使用长整数,而不必添加 L 或者 l 的后缀. print在 Python 3 中是函数. 在交互式解释器中使用 if 语句,需 ...
- python基础教程目录-Python基础教程(第2版 修订版) 简介,目录书摘
编辑推荐: <Python基础教程(第2版·修订版)>是经典的Python入门教程,层次鲜明,结构严谨,内容翔实,特别是最后几章,作者将前面讲述的内容应用到10个引人入胜的项目中,并以模板 ...
- python基础教程书籍推荐-入门python有什么好的书籍推荐?
Python编程语言有许多语法结构.标准库函数和交互式开发环境功能.好在,你可以忽略大多数内容.你只需要学习部分内容,就能编写一些方便的小程序. 但在动手之前,你必须学习一些基本编程概念.就像魔法师培 ...
最新文章
- 基于tiny4412的Linux内核移植 -- eMMC驱动移植(六)
- 详解 WebRTC 高音质低延时的背后 — AGC
- 2021金蝶全球创见者大会成功举办, 500强企业共话EBC数字战斗力
- Linux中英文命令对应
- 太难了!线下教培受重创,这家企业无奈宣布全员工资3.5折5个月
- 开发 面试_农行软件开发中心实习面试
- express日常开发总结
- 跟着团子学SAP—SAP LTMC基础教程(物料主数据导入示例)
- netkeeper客户端_Netkeeper校园客户端(创翼客户端)下载
- ImDisk 命令行用法
- 巨量引擎api对接 php,巨量引擎Marketing API 现已开放多种创意能力接口
- matlab实现单峰物体复原--光栅投影-多频外差
- 一键下载QQ空间相册,微博相册,知乎回答图片,豆瓣图片,instagram图片
- zbbz cnk
- 写给想学Linux系统的人
- Vue-全局websocket 实现消息推送
- leetcode:13、罗马数字包含以下七种字符: I, V, X, L,C,D 和 M。
- 华硕x450jn拆机_华硕X450JN笔记本拆机升级SSD,影驰ONE120固态硬盘上手
- HTML thead 标签
- HDU-2549 壮志难酬
热门文章
- 改善EF代码的方法(下)
- jQuery 1.10.0 和 2.0.1 发布
- 第10章 常用功能及函数集;客户端IP地址
- 逻辑判断 java_写 JS 逻辑判断,不要只知道用 if-else 和 switch
- linux中menu命令,menucofig 详解
- python语句x 3 3执行_Python语言中,x=2,y=3,执行x,y=y,x之后,x和y的值分别是什么?...
- 【MM模块】ERS and Invoicing Plans 发票计划
- 【PP】长交期计划(LTP)简介
- 【PP操作手册】运行MRP产生计划订单
- 售达方、送达方的区别