property 属性

发布时间 2023-08-27 16:07:15作者: Allen_Hao

说明

在 Python 中,property 属性是一种特殊的属性,它允许你在访问和设置对象的属性时执行自定义的操作。property 属性用于将方法转化为属性从而在外部代码中可以像访问普通属性一样访问这些方法。它是一种实现封装和控制属性访问的强大工具。

property 属性的主要目的是提供一种更加灵活和可控的方式来处理类的属性,它能够让你定义在属性被读取、设置或删除时需要执行的逻辑,从而实现属性访问的各种行为。

property 属性通常由以下几个部分组成:

  1. getter 方法:用于获取属性值。这个方法在你访问属性时被调用。

  2. setter 方法:用于设置属性值。这个方法在你给属性赋值时被调用。

  3. deleter 方法:用于删除属性。这个方法在你使用 del 语句删除属性时被调用。

通过定义这些方法,你可以控制对属性的访问、修改和删除,从而实现数据的封装和更复杂的操作。

说白了就是把方法装饰成属性。使用方式与使用属性一样。这在封装数据、控制访问权限以及动态计算属性时非常有用。

分类

property 的定义方式有两种:使用装饰器和经典的 getter、setter、deleter 方法。

示例

1. 没有使用property属性的样子

 1 class Person(object):
 2     def __init__(self):
 3         self.__age = 0
 4 
 5     # 获取属性
 6     def get_age(self):
 7         return self.__age
 8 
 9     # 修改属性
10     def set_age(self, new_age):
11         self.__age = new_age
12 
13 
14 # 方式1: 正常的对象调用方法即没有使用property属性
15 p = Person()
16 age = p.get_age()
17 print(age)
18 p.set_age(10)
19 age = p.get_age()
20 print(age)

输出结果:

0
10

  

2.  使用装饰器方式

 1 '''
 2 在Python中,可以使用两种方式来定义类的属性:使用装饰器和使用经典的getter、setter、deleter方法。这两种方式都可以用来在类中实现属性的访问控制和操作。
 3 1. 使用装饰器方式定义属性:
 4     Python引入了property装饰器,它允许你将一个方法标记为属性,并在访问属性时自动调用该方法。property装饰器可以用来创建只读、只写或读写属性
 5 2. 使用经典的 getter、setter、deleter 方法方式定义属性:
 6     在Python中,你也可以使用经典的getter、setter和deleter方法来定义属性,这种方式更加灵活,允许你在属性访问、设置和删除时执行自定义操作。
 7 '''
 8 
 9 class Circle:
10     def __init__(self, radius):
11         self._radius = radius
12 
13     @property  # 使用装饰器方式,让radius方法像属性一样使用,属性名为radius。  读
14     def radius(self):
15         return self._radius
16 
17     @radius.setter  # @方法名.setter,把此方法当属性使用,为其赋值时,自动执行此方法。 写
18     def radius(self, value):
19         if value >= 0:
20             self._radius = value
21         else:
22             raise ValueError("Radius cannot be negative.")
23 
24     @property
25     def area(self):  # 只为此属性,设置了读,无写
26         return 3.14159 * self._radius ** 2
27 
28 
29 circle = Circle(5)
30 print(circle.radius)  # 使用属性访问器获取半径
31 print(circle.area)  # 自动计算面积
32 circle.radius = 7  # 使用属性设置器设置半径
33 print(circle.radius)
34 print(circle.area)

输出:

5
78.53975
7
153.93791

  

3. 经典的 getter、setter、deleter 方法

'''
在Python中,可以使用两种方式来定义类的属性:使用装饰器和使用经典的getter、setter、deleter方法。这两种方式都可以用来在类中实现属性的访问控制和操作。
1. 使用装饰器方式定义属性:
    Python引入了property装饰器,它允许你将一个方法标记为属性,并在访问属性时自动调用该方法。property装饰器可以用来创建只读、只写或读写属性
2. 使用经典的 getter、setter、deleter 方法方式定义属性:
    在Python中,你也可以使用经典的getter、setter和deleter方法来定义属性,这种方式更加灵活,允许你在属性访问、设置和删除时执行自定义操作。
'''


class Rectangle:
    def __init__(self, width, height):
        self._width = width
        self._height = height

    def get_width(self):  # 经典的getter方法
        return self._width

    def set_width(self, value):  # 经典的setter方法
        if value >= 0:
            self._width = value
        else:
            raise ValueError("Width cannot be negative.")

    def del_width(self): # 经典的deleter方法
        del self._width

    width = property(get_width, set_width, del_width) # property属性装饰一下

    @property
    def area(self):
        return self._width * self._height


rectangle = Rectangle(4, 5)
print(type(rectangle.width))  # <class 'int'>
print(rectangle.width)  # 使用属性访问器获取宽度
print(rectangle.area)
rectangle.width = 6  # 使用属性设置器设置宽度
print(rectangle.width)
print(rectangle.area)
del rectangle.width  # 使用属性删除器删除宽度属性

输出:

<class 'int'>
4
20
6
30