python @property

发布时间 2023-05-26 00:26:20作者: sqmw

在 Python 中,@property 是一个装饰器,它可以帮助我们将类的方法转换成只读属性,使用这个装饰器之后,其实就是getter,其他的对该属性的操作必须使用装饰器申明,否则报错
使用 @property 装饰器的语法如下:

class MyClass:
    def __init__(self):
        self._my_property = 0

    @property
    def my_property(self):
        return self._my_property

上面代码中,@property 装饰器将 my_property() 方法转换成了 my_property 一个只读属性。通过该装饰器,我们可以在不改变代码结构的前提下,将原本需要调用方法才能获取的属性值,变为直接访问实例变量那样的方式来获取属性。

除了 getter 方法,@property 还允许我们定义setterdeleter 方法,它们分别在赋值时和删除属性时被调用。下面是一个完整的例子:

class MyClass:
    def __init__(self):
        self._my_property = 0

    @property
    def my_property(self):
        return self._my_property

    @my_property.setter
    def my_property(self, value):
        self._my_property = value

    @my_property.deleter
    def my_property(self):
        del self._my_property

在上面的例子中,定义了一个类 MyClass,其中包含一个名为 my_property() 的方法,该方法被装饰为一个只读属性。然后又定义了一个 setter 方法 my_property(self, value),用于设置属性值。此外,还定义了一个 deleter方法 my_property(self),用于删除属性。

需要注意的是,在使用 @property 装饰器时有以下几个注意事项:

  1. 只有原方法名和对应的 setter 方法名以及 deleter 方法名相同的函数,才能共享同一个名称并通过 @property 装饰器实现属性方法的转换。
  2. 被装饰为只读属性的方法只能读取属性值,不能修改属性值。如果需要修改属性值,则需要使用 setter 方法。
  3. 定义 gettersetterdeleter方法时,它们的形参列表都必须与待转换的方法相同,否则无法正常使用 @property 装饰器进行转换。
  4. 如果未定义 deleter 方法,则无法删除属性,否则会报错。
  5. @property 装饰器只能应用于新式类中。而在 Python 3中,所有类都默认为新式类,所以不需要显式地继承 object 类。