Python中,@property是一个内置装饰器,用于创建只读属性(read-only attribute)的一个简便方法。通过使用property装饰器,可以将类中的方法转换为与属性相同的方式访问,有助于实现数据封装和数据隐藏。property() 也用于创建属性,也可以用类中的方法来控制对某个实例属性的访问、设置、删除等操作,但它们在使用方式上有所不同。

1、@property装饰器

@property 装饰器是一个更方便、简洁的方式,用于将类中的方法转换为同名的只读属性。通过在方法定义前加上 @property 装饰器,可以将这个方法作为属性的"获取"方法。如还需要定义设置或删除属性的方法,可以使用 @属性名.setter 和 @属性名.deleter 装饰器。

class Celsius:
    def __init__(self, temperature=0):
        self._temperature = temperature

    @property
    def temperature(self):
        print("Getting value...")
        return self._temperature

    @temperature.setter
    def temperature(self, value):
        print("Setting value...")
        if value < -273.15:
            raise ValueError("Temperature below -273.15 is not possible.")
        self._temperature = value

# 使用
c = Celsius()
c.temperature = 37
print(c.temperature)

2、property() 函数

property() 是一个内置函数,可以用来创建或返回一个属性值。property() 函数的典型用法是在类定义中创建一个只读属性,它接受四个参数:fget, fset, fdeldoc,分别对应属性的获取方法、设置方法、删除方法和文档字符串。

参数描述
fget用于获取属性值的函数
fset用于设置属性值的函数
fdel用于删除属性值的函数
doc属性的文档字符串,如果没有提供,
则从fget函数中获取

使用示例:

class Celsius:
    def __init__(self, temperature=0):
        self._temperature = temperature

    def get_temperature(self):
        print("Getting value...")
        return self._temperature

    def set_temperature(self, value):
        print("Setting value...")
        if value < -273.15:
            raise ValueError("Temperature below -273.15 is not possible.")
        self._temperature = value

    temperature = property(get_temperature, set_temperature)

# 使用
c = Celsius()
c.temperature = 38
print(c.temperature)

3、property() 函数 和 @property装饰器 区别

property() 函数 需要显式地传入获取、设置、删除方法和文档字符串,适用于早期的Python版本,或者当需要在运行时动态地创建属性时。@property 装饰器 提供了一种更为简洁和直观的方式来定义属性及其访问器方法。它使得代码更加易读和易于维护。@property 装饰器是更推荐的方式,因为它让代码更加简洁和Pythonic。然而,了解 property() 函数的工作方式也是很有用的,尤其是在需要与早期代码兼容或执行一些特殊操作时。

推荐文档