面向对象进阶-property装饰器的用法 (PY高级编程系列)

面向对象进阶-property装饰器的用法

对属性的值进行限制

之前可以使用 set和get方法

class Person:
    # age 属性的值限制 0~88 | 以前可以使用 set 和 get方法
    def getAge(self):
        return self._age  # 下划线表示私有属性
    
    # 如果用户不使用 set 那就不能进行阻止 当然写入的也不是 self._age
    def setAge(self, value):
        if 0 <= value <= 88:
            self._age = int(value)
        else:
            # raise Exception('age的值在 (0~99) 之间的整数') | 可以抛出异常
            print('age的值在 (0~99) 之间的整数')
            self._age = 0  # 也可以设置默认值 (但设置默认值感觉不太好)
    pass


if __name__ == '__main__':
    p = Person()
    p.age = 18
    
    print(p.age)

    p.age = 100  # 这就不那么好
    
    print('-' * 80)
    p.setAge(18)
    print(p.getAge())  # 18
    p.setAge(100)
    print(p.getAge())  # 0 并输出提示信息

面向对象进阶-property装饰器的用法 (PY高级编程系列)

现在可以使用 装饰器 @property 与 @age.setter

class Person:  
    # 直接定义一个与属性名相同的方法
    @property  # 使用修饰符进行修饰 这是用于获取
    def age(self):
        return self._age
    
    # 也是直接定义一个与属性名相同的方法
    @age.setter
    def age(self, value):
        if 0 <= value <= 88:
            self._age = int(value)
        else:
            raise Exception('age的值在 (0~99) 之间的整数')
        
    pass

if __name__ == '__main__':
    p = Person()

    p.age = 18
    print(p.age)
    p.age = 100
    print(p.age)

面向对象进阶-property装饰器的用法 (PY高级编程系列)

只读处理 (装饰器 @property)

class Person:
    def __init__(self, name='张三'):
        self._name = name
    
    # 如果只暴露下面这一个方法 表示只允许读 不能改 (可以在实例化对象时传入初始值, 也可以设置内置)
    @property
    def name(self):
        self._name = '李四'
        return self._name

if __name__ == '__main__':
    p = Person()
    
    p.name = '张三'  # 无法设置属性 'name'
    print(p.name)

    # p.name = '张三'
    print(p.name)

面向对象进阶-property装饰器的用法 (PY高级编程系列)

面向对象进阶-property装饰器的用法 (PY高级编程系列)
有点短…

上一篇:使用Charles对Android App的https请求进行抓包


下一篇:Property ‘mapperLocations‘ was not specified.