第一种:由于新式类中具有三种访问方式,我们根据他们的几个属性的访问特点,分别将三个方法定义为同一个属性:获取、修改、删除
class Goods:
'''python3中默认继承object类,所以有三种@property装饰器'''
# python3和python2都可以使用 获取值
@property
def price(self):
print('@property')
# 赋值
@price.setter
def price(self, value):
print('@price.setter')
# 删除
@price.deleter
def price(self):
print('@price.deleter')
'''调用'''
obj = Goods()
obj.price # 自动执行 @property 修饰的price方法,并获取方法的返回值
obj.price = 123 # 自动执行 @price.setter 修饰的price方法,并将123赋值给方法的参数
del obj.price # 自动执行 @price.deleter 修饰的price方法
demo
class Goods:
def __init__(self):
# 原价
self.original_price = 100
# 折扣
self.discount = 0.8
# 取值
@property
def price(self):
# 实际价格 = 原件 * 折扣
new_price = self.original_price * self.discount
return new_price
# 赋值
@price.setter
def price(self, value):
self.original_price =value
# 删除
@price.deleter
def price(self):
del self.original_price
'''调用'''
obj = Goods()
obj.price # 获取商品价格
obj.price = 200 # 修改商品价格
del obj.price # 删除商品原价
第二种:创建property属性的方式-类属性 property(fget=None, fset=None, fdel=None, doc=None) 四个参数
第一个参数是方法名,调用对象.属性时自动触发执行方法
第二个参数是方法名,调用对象.属性 = XXX时自动触发执行方法
第三个参数是方法名,调用del对象.属性时自动触发执行方法
第四个参数是字符串,调用对象.属性.__doc__,此参数是该属性的描述信息
class Foo:
def get_bar(self):
return 'laowang'
BAR = property(get_bar) # 类属性
obj = Foo()
result = obj.BAR # 自动调用get_bar方法,并获取方法的返回值
print(result)
demo
#coding:utf-8
class Foo:
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方法