1. property属性

目的:简化逻辑流程

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

//test2

class Pager(object):
def __init__(self, current_page):
# 用户当前请求的页码(第一页,第二页....)
self.current_page = current_page
# 每页默认显示10条数据
self.per_items = 10 @property
def start(self):
val = (self.current_page - 1) * self.per_items
return val @property
def end(self):
val = self.current_page * self.per_items
return val p = Pager(1)
print(p.start) # 就是起始值,即 m
print(p.end) # 就是结束值,即 n

2. property属性的两种方式

  • 装饰器 即:在方法上应用装饰器

  • 类属性 即:在类中定义值为property对象的类属性

2.1 装饰器方法

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

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

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

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

@property

@xxx.setter

@xxx.deleter

class Goods(object):
"""
python3 里面才有 @xxx.setter, @xxx.deleter
python2 里面只有 @property
"""
@property
def gname(self):
return "@property" @gname.setter
def gname(self, value):
print("@gname.setter", value) @gname.deleter
def gname(self):
print("@gname.deleter") obj = Goods()
ret = obj.gname # 自动执行 @property 修饰的price方法,并获取方法的返回值
print(ret)
obj.gname = "cute" # 自动执行 @gname.setter 修饰的price方法,并将 123 赋值给方法参数 del obj.gname # 删除obj名字
@property
@gname.setter cute
@gname.deleter

2.2 类属性方法,创建值为property对象的类属性

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

#!/usr/bin/python3
#-*- coding:utf-8 -*- class Foo(object):
def get_bar(self):
return "douzi" BAR = property(get_bar) obj = Foo()
res = obj.BAR # 自动调用get_bar方法, 并获取方法的返回值
print(res)

property方法中有四个参数

  • 第一个参数是方法名,调用 对象.属性 时自动触发执行方法

  • 第二个参数是方法名,调用 对象.属性 = xxx 时自动触发执行方法

  • 第三个参数是方法名,调用 del 对象.属性 时自动触发执行方法

  • 第四个参数是字符串,调用 对象.属性.__doc__,此参数是该属性的描述信息

#!/usr/bin/python3
#-*- coding:utf-8 -*- class Foo(object):
def get_bar(self):
print("getter....")
return "douzi" def set_bar(self, value):
"""必须两个参数"""
print("setter....", value) def del_bar(self):
print("deleter...")
return "del value" BAR = property(get_bar, set_bar, del_bar, "description....") obj = Foo()
res = obj.BAR # 自动调用get_bar方法, 并获取方法的返回值
print("getter....", res) obj.BAR = "dou zi" del obj.BAR print(Foo.BAR.__doc__)

3. 私有属性添加setter和getter方法

调用的方法可以通过各种逻辑处理

 #!/usr/bin/python3
#-*- coding:utf-8 -*- class Money(object):
def __init__(self):
self.__money = 0 def getMoney(self):
return self.__money def setMoney(self, value):
if isinstance(value, int):
self.__money = value
else:
print("error: 不是整型数字") # 定义一个属性,当对这个money设置值时调用setMoney,获取值时调用getMoney
money = property(getMoney, setMoney) a = Money()
a.money = 100 # 调用setMoney
print(a.money) # 调用getMoney

新式类

#!/usr/bin/python3
#-*- coding:utf-8 -*- class Money(object):
def __init__(self):
self.__money = 0 @property
def Money(self):
return self.__money @Money.setter
def Money(self, money):
if isinstance(money, int):
self.__money = money
else:
print("error: 不是整型数字") a = Money()
a.money = 100 # 调用setMoney
print(a.money) # 调用getMoney

最新文章

  1. js-JavaScript高级程序设计学习笔记21 改善JavaScript性能的方法
  2. MySQL事务学习-->隔离级别
  3. mysql密码遗忘和登陆报错问题
  4. [codeforces 55]D. Beautiful numbers
  5. python中的Queue
  6. How to Write and Publish a Scientific Paper: 7th Edition(科技论文写作与发表教程)(11.04更新)
  7. lucene_indexWriter说明、索引库优化
  8. 用crontab、crond在嵌入式系统中添加定时任务
  9. 网络流(最大流) POJ 1637 Sightseeing tour
  10. JQuery实现 checkbox 全选、反选,子checkbox有没选去掉全选
  11. phpmailer发送邮件,可以带附件
  12. Laravel分页
  13. LNMP1.3 一键配置环境,简单方便
  14. 如何使用MOQ进行单元测试
  15. 洛谷P2286 [HNOI2004]宠物收养场【Treap】题解+AC代码
  16. 【Java入门提高篇】Day14 Java中的泛型初探
  17. Android中典型的ROOT原理(5)
  18. Python 下载win32api 模块
  19. 24 Game
  20. 第5章 Java中的锁

热门文章

  1. vbs查找Excel中的Sheet2工作表是否存在不存在新建
  2. python多线程扫描爆破网站服务器思路【笔记】
  3. Oracle密码过期 ORA-28002:口令将过期 解决方法
  4. celery retry发送的队列
  5. lstm-bp过程的手工源码实现
  6. 配置Sublime,为了Python
  7. SIGAI机器学习第十八集 线性模型2
  8. https://www.cnblogs.com/myblogs-miller/p/9046425.html
  9. am335x system upgrade rootfs for dhcpcd cross compile(十三)
  10. P1894 [USACO4.2]完美的牛栏The Perfect Stall