MST

星途 面试题库

面试题:Python中如何通过属性装饰器实现封装与数据隐藏

请说明在Python中,如何利用@property、@属性名.setter等装饰器来实现类属性的封装和数据隐藏,并举例说明如何在类中定义只读属性和可读写属性。
25.4万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试

在Python中,@property@属性名.setter 等装饰器可用于实现类属性的封装和数据隐藏。

  1. 实现封装和数据隐藏

    • @property 装饰器将一个方法转换为属性,使得可以像访问普通属性一样访问该方法,同时隐藏了属性的实现细节。
    • @属性名.setter 装饰器用于定义属性的设置方法,从而控制属性的赋值操作。
  2. 定义只读属性: 只使用 @property 装饰器,不定义 @属性名.setter 方法,这样该属性就只能读取,不能修改。

示例代码如下:

class Person:
    def __init__(self, name):
        self._name = name

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


p = Person('Alice')
print(p.name)  # 访问只读属性
# p.name = 'Bob'  # 尝试赋值会报错,因为name是只读属性
  1. 定义可读写属性: 使用 @property 装饰器定义读取方法,使用 @属性名.setter 装饰器定义设置方法。

示例代码如下:

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

    @property
    def width(self):
        return self._width

    @width.setter
    def width(self, value):
        if value > 0:
            self._width = value
        else:
            raise ValueError("Width must be a positive number")

    @property
    def height(self):
        return self._height

    @height.setter
    def height(self, value):
        if value > 0:
            self._height = value
        else:
            raise ValueError("Height must be a positive number")


r = Rectangle(5, 10)
print(r.width)  # 读取宽度
r.width = 7  # 设置宽度
print(r.width)  # 再次读取宽度
# r.width = -3  # 尝试设置负数宽度会报错

通过上述方式,可以有效地在Python类中实现属性的封装、数据隐藏,以及定义只读和可读写属性。