Python: property属性

2019-06-22  本文已影响0人  xiaohan_zhang

@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

通过name mangling((名字重整),目的就是防止子类意外重写父类或基类的方法或属性,如:_Class_object) 就可以访问private了

上一篇下一篇

猜你喜欢

热点阅读