Skip to content

计算属性

计算属性

简介

在封装类时,如果实例属性定义为公有属性,在使用过程中不安全,一般建议定义为私有属性,但是私有属性又不能在类的外部直接访问,此时,需要为私有实例属性提供访问的操作接口方法。

属性访问器和修改器

属性访问器:也称为 Getter 方法,用来返回某个属性的值,该方法无参数,但必须有返回值,一般以 get_xxx 命名。 属性修改器:也称为 Setter 方法,用来给某个属性值进行修改,该方法接收一个参数,且无返回值,一般以 set_xxx 命名。

class Person:
    def __init__(self, name):
        self._name = name

    def get_name(self):
        return self._name

    def set_name(self, name):
        self._name = name


if __name__ == '__main__':
    tom = Person("tom")
    print(tom.get_name())
    tom.set_name("Tom")
    print(tom.get_name())

虽然实现了需求,但此方式在使用实例属性时,变成了以方法形式使用,不够简洁。

@property 装饰器

Python 提供了一个名为 property 的装饰器,通过该装饰器可以为私有属性提供访问器和修改器方法,但在使用时,依然可以以属性的形式进行使用。

  • 提供数据访问功能(getter
    • 计算属性
    • 语法:使用@property装饰器
    • 调用:实例.方法名
  • 提供数据操作功能(setter
    • 语法:使用@计算属性名.setter装饰器
    • 调用:实例.方法名

注意:

  • 当定义计算属性时,必须先使用 property 装饰器定义计算属性的访问器访问,然后才可以利用计算属性名定义修改器方法。
  • 访问器方法和修改器方法不需要再使用 getset 做为前缀。
class Person:
    def __init__(self, name):
        self._name = name

    @property
    def username(self):
        return self._name

    @username.setter
    def username(self, name):
        if name.isalpha():
            self._name = name


if __name__ == '__main__':
    tom = Person("tom")
    print(tom.username)
    tom.username = "Tom"
    print(tom.username)

计算属性的优势

  • 可以隐藏实现细节
  • 可以进行访问控制
  • 可以进行数据验证
  • 不改变属性操作方式基础上完成复杂的逻辑控制