面试题答案
一键面试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)
解释:
- 首先定义了一个属性描述符类
Descriptor
,它具有基本的__get__
和__set__
方法来管理属性。 Base
类使用了这个描述符来管理attr
属性。- 在
Sub
类中,为了重写或扩展属性描述符的功能,定义了一个新的描述符类CustomDescriptor
,它继承自基类的描述符Descriptor
。 - 在
CustomDescriptor
类的__set__
方法中,添加了值验证的功能,只有当值为整数时才会设置属性,同时通过super().__set__(instance, value)
调用基类描述符的__set__
方法,以保证与基类的兼容性。 - 最后通过创建
Sub
类的实例,测试属性的设置和获取,以及验证功能。