美文网首页
Python: property属性

Python: property属性

作者: xiaohan_zhang | 来源:发表于2019-06-22 13:07 被阅读0次

    @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了

    相关文章

      网友评论

          本文标题:Python: property属性

          本文链接:https://www.haomeiwen.com/subject/ofgmqctx.html