MST

星途 面试题库

面试题:Python属性描述符与继承关系

假设有一个基类Base,其中使用了属性描述符来管理某个属性。现在有一个子类Sub继承自Base,在子类中如何重写或扩展这个属性描述符的功能,同时保证与基类的兼容性?请给出代码示例并解释。
44.2万 热度难度
编程语言Python

知识考点

AI 面试

面试题答案

一键面试
class Descriptor:
    def __init__(self, initial_value=None):
        self.value = initial_value

    def __get__(self, instance, owner):
        return self.value

    def __set__(self, instance, value):
        self.value = value


class Base:
    attr = Descriptor()


class Sub(Base):
    def __init__(self):
        super().__init__()
        self._custom_attr = None

    class CustomDescriptor(Descriptor):
        def __set__(self, instance, value):
            # 扩展功能,比如对值进行验证
            if not isinstance(value, int):
                raise ValueError("Value must be an integer")
            super().__set__(instance, value)

    attr = CustomDescriptor()


# 测试
sub_obj = Sub()
sub_obj.attr = 10
print(sub_obj.attr)

try:
    sub_obj.attr = "not an integer"
except ValueError as e:
    print(e)

解释

  1. 首先定义了一个属性描述符类Descriptor,它具有基本的__get____set__方法来管理属性。
  2. Base类使用了这个描述符来管理attr属性。
  3. Sub类中,为了重写或扩展属性描述符的功能,定义了一个新的描述符类CustomDescriptor,它继承自基类的描述符Descriptor
  4. CustomDescriptor类的__set__方法中,添加了值验证的功能,只有当值为整数时才会设置属性,同时通过super().__set__(instance, value)调用基类描述符的__set__方法,以保证与基类的兼容性。
  5. 最后通过创建Sub类的实例,测试属性的设置和获取,以及验证功能。