您的位置:

5. Python 属性装饰器——@property

Python 属性装饰器——@property

更新:

@property装饰器是 Python 中用于属性()函数的内置装饰器。 在类中的任何方法上使用@property装饰器,将该方法用作属性。

您可以使用以下三个装饰器来定义属性:

  • @property:将方法声明为属性。
  • @ 。setter:为将值设置为属性的属性指定 setter 方法。
  • @ 。deleter:将 delete 方法指定为删除属性的属性。

申报财产

下面将方法声明为属性。此方法必须返回属性值。

Example: @property decorator

class Student:

    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name 

上图,@property装饰器应用于name()方法。 name()方法返回私有实例属性值__name。 因此,我们现在可以使用name()方法作为属性来获取__name属性的值,如下所示。

Example: Access Property decorator

>>> s = Student('Steve')
>>> s.name 
'Steve' 

属性设置器

上面,我们将name()方法定义为一个属性。我们只能访问name属性的值,但不能修改它。 要修改属性值,我们必须使用@property-name.setter装饰器为name属性定义 setter 方法,如下所示。

Example: Property Setter

class Student:

    def __init__(self, name):
        self.__name=name

    @property
    def name(self):
        return self.__name

    @name.setter   #property-name.setter decorator
    def name(self, value):
        self.__name = value 

上面,我们有两个name()方法的重载。一个是 getter 方法,另一个是 setter 方法。 setter 方法必须具有可用于分配给基础私有属性的值参数。 现在,我们可以检索和修改属性值,如下所示。

Example: Access Property

>>> s = Student('Steve')
>>> s.name 
'Steve'
>>> s.name = 'Bill'
'Bill' 

属性删除

使用@property-name.deleter装饰器定义删除属性的方法,如下所示。

Example: Property Deleter

class Student:
    def __init__(self, name):
        self.__name = name

    @property
    def name(self):
        return self.__name

    @name.setter
    def name(self, value):
        self.__name=value

    @name.deleter   #property-name.deleter decorator
    def name(self, value):
        print('Deleting..')
        del self.__name 

当您使用关键字del删除属性时,将调用删除程序,如下所示。一旦删除属性,就不能使用同一实例再次访问它。

Example: Delete a Property

>>> s = Student('Steve')
>>> del s.name 
Deleting.. 
>>> s.name 
Traceback (most recent call last):                              
File "<pyshell#16>", line 1, in <module>            
    p.name                                                      
File "C:\Python37\test.py", line 6, in name                     
    return self.__name                                          
AttributeError: 'Student' object has no attribute '_Student__name'