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