property
property 属性
class 类名:
@property
def 方法名(silf):
return 返回值
对象 = 类()
变量 = 对象.方法名
print(变量)
注:
- 只能有一个参数self。注:两个参数则需要传值,但property的调用方法-对象.方法名默认不传值
- 方法当做属性调。注:若使用对象名.方法名()的方式,则为一个"int"值的(),即"int"() 将报错
- 直接得到方法的返回值 即函数的封装 (可用于分页)
- 用property方法的优势,(即property属性调用时不需要传参)。注:使用return 调用函数也能得到值,但是需确定调用函数是否需要传值。
创建property属性的方法-装饰器
创建流程:
class Goods():
@property
def price(self):
print("@proterty")
@price.setter
def price(self,value):
print("@proterty.setter")
@price.deleter
def price(self):
print("@proterty.deleter")
g = Goods()
g.price # 获取
g.price = value # 设置
del g.price # 删除
注:
- 根据不同调用方法,调用不同的property方法
- 三种方法的方法名需要相同
- @property 获取
@方法名.setter 设置
@方法名.deleter 删除
应用01:
class Goods:
def __init__(self):
# 原价
self.original_prince = 100
# 折扣
self.discount = 0.8
@property
def price(self):
# 实际价格 = 原价 + 折扣
new_price = self.original_prince *self.discount
return new_price
@price.setter
def price(self,value):
self.original_prince = value
@price.deleter
def price(self):
del self.original_prince
obj = Goods()
print(obj.price) # 获取商品价格
obj.price = 200 # 修改商品原价
print(obj.price)
del obj.price # 删除商品原价
# print(obj.prince)
创建property属性的方法-类属性
创建流程:
class Foo:
def get_bar(self):
return "zhangsan"
BAR = property(get_bar)
f = Foo()
reuslt = f.BAR # 自动调用get_bar方法,并获取方法的返回值
print(reuslt)
注:
- property的作用是:简化代码
- 方法名 = property(原获取方法名,原设置方法名,原删除方法名,字符串-返回信息)
- 字符串通过对象.属性.__doc __ 调用
应用01:
#coding=utf-8class Foo(object):
def get_bar(self):
print("getter...")
return 'laowang'
def set_bar(self, value):
"""必须两个参数"""
print("setter...")
return 'set value' + value
def del_bar(self):
print("deleter...")
return 'laowang'
BAR = property(get_bar, set_bar, del_bar, "description...")
obj = Foo()
obj.BAR # 自动调用第一个参数中定义的方法:get_bar
obj.BAR = "alex" # 自动调用第二个参数中定义的方法:set_bar方法,并将“alex”当作参数传入
desc = Foo.BAR.__doc__ # 自动获取第四个参数中设置的值:description...
print(desc)
del obj.BAR # 自动调用第三个参数中定义的方法:del_bar方法
应用02: 使用property升级getter和setter方法
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方法
#100