20.python@property

发布时间 2023-08-16 22:17:20作者: 贝壳里的星海

python@property

python的@property是python的一种装饰器,是用来修饰方法的。

作用

我们可以使用@property装饰器来创建只读属性,@property装饰器会将方法转换为相同名称的只读属性,可以与所定义的属性配合使用,这样可以防止属性被修改。让方法可以以属性的形式被访问和调用

  • 保护类的封装特性
  • 使用“对象.属性”的方式操作操作类属性
class Circle:
    def __init__(self, area):
        self.__area = area
        self.__radius=5

    @property
    def area(self):
        return self.__area

    def radius(self):
        return self.__radius


circle = Circle(30)
# 直接通过方法名来访问 area 方法
print("圆的面积是:", circle.area)
# 矩形的面积是: 30

# 类中只包含该方法,那么 area 属性将是一个只读属性。
# 也就是说,在使用 Circle 类时,无法对 area 属性重新赋值
print("圆的半径是:",circle.radius())

circle.area = 90
print("修改后的面积:", circle.area)
---------------------------------------------------------------------------
圆的面积是: 30
圆的半径是: 5 
Traceback (most recent call last):
AttributeError: can't set attribute

property() 函数

语法说明:

property(fget=None, fset=None, fdel=None, doc=None) -> property attribute
  • fget 是获取属性值的方法。
  • fset 是设置属性值的方法。
  • fdel 是删除属性值的方法。
  • doc 是属性描述信息。
class Student:
    def __init__(self):
        self._age = None

    def get_age(self):
        print('获取属性时执行的代码')
        return self._age

    def set_age(self, age):
        print('设置属性时执行的代码')
        self._age = age

    def del_age(self):
        print('删除属性时执行的代码')
        del self._age

    age = property(get_age, set_age, del_age, '学生年龄')


student = Student()
# 注意要用 类名.属性.__doc__ 的形式查看属性的文档字符串
print('查看属性的文档字符串:' + Student.age.__doc__)
# 查看属性的文档字符串:学生年龄

# 设置属性
student.age = 18
# 设置属性时执行的代码

# 获取属性
print('学生年龄为:' + str(student.age))
# 获取属性时执行的代码
# 学生年龄为:18

# 删除属性
del student.age
# 删除属性时执行的代码

@property 装饰器

@property 语法糖提供了比 property() 函数更简洁直观的写法。

  • @property 装饰的方法是获取属性值的方法,被装饰方法的名字会被用做 属性名。

  • @属性名.setter 装饰的方法是设置属性值的方法。

  • @属性名.deleter 装饰的方法是删除属性值的方法。

class Student:
    def __init__(self):
        self._age = None

    @property
    def age(self):
        print('获取属性时执行的代码')
        return self._age

    @age.setter
    def age(self, age):
        print('设置属性时执行的代码')
        self._age = age

    @age.deleter
    def age(self):
        print('删除属性时执行的代码')
        del self._age

student = Student()

设置属性
student.age = 18
# 设置属性时执行的代码

# 获取属性
print('学生年龄为:' + str(student.age))
# 获取属性时执行的代码
# 学生年龄为:18

# 删除属性
del student.age
# 删除属性时执行的代码