@property可以把一个实例方法变成其同名属性,以支持.号访问
@property属性的两种方式
装饰器:在方法上应用装饰器
类属性:在类中定义值为property对象的类属性
装饰器:
新式类@property的三种方法(获取值、设置值、删除属性),用几个写几个即可
# 取代setter getter方法
class Goods(object):
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):
print("price.deleter")
del self.original_price
obj = Goods()
p = obj.price # 自动执行 @property 修饰的 price 方法,并获取方法返回值
print("商品原价:%.2f" % p)
obj.price = 200 # 自动执行 @price.setter 修饰的 price 方法,并将100赋值给方法的参数
print("修改后商品原价:%.2f" % obj.price)
# 删除商品原价
del obj.price # 自动执行 @price.deleter 修饰的 price 方法
类属性方式:
创建值为property对象的类属性
property方法中有四个参数:
参数一:方法名,调用对象.属性时 自动触发执行方法
参数二:方法名,调用对象.属性=XXX时 自动触发执行方法
参数三:方法名,调用del 对象.属性时 自动触发执行方法
参数四:字符串,调用类.属性.doc时 此参数是该属性的描述信息
注:一般前两个参数就够了
# 升级setter getter方法
class Foo(object):
def __init__(self):
self._name = "xiaolan"
def get_bar(self):
return self._name
def set_bar(self, value):
self._name = value
def del_bar(self):
print("del_bar")
name = property(get_bar, set_bar, del_bar, "description...")
f = Foo()
ret = f.name # 自动调用第一个参数中定义的方法:get_bar
print(ret)
f.name = "AAA" # 自动调用第二个参数中定义的方法:set_bar
print(f.name)
desc = Foo.name.__doc__ # 自动获取到第四个参数中设置的值
print(desc)
del f.name # 自动调用第三个参数中定义的方法:del_bar
- 私有化
xx: 公有变量
_xx: 私有化属性或方法,from somemodule import * 禁止导入,类对象和子类可以访问
_xx: 避免与子类中的属性命名冲突,无法再外部直接访问
xx: 用户名字控件的魔法对象或属性。例如:init,不要自己发明这样的名字
xx: 用于避免与Python关键字冲突
通过name mangling((名字重整),目的就是防止子类意外重写父类或基类的方法或属性,如:_Class_object) 就可以访问private了
网友评论