# 子类中扩展父类描述符
# 概述
当一个类定义了一个描述符时,该描述符只能在该类的实例中被访问,并且不会被子类继承。例如:
这里暂时存疑
当我们想对父类的描述符进行扩展时,可以采取如下的方式:
from utils import debug
class Parent:
def __init__(self, name) -> None:
self._name = name
@property
def name(self):
return "111"
@name.setter
def name(self, value):
if not isinstance(value, str):
raise TypeError(f"Except a string")
self._name = value
class Son(Parent):
@Parent.name.setter
def name(self, value):
if len(value) < 10:
raise ValueError("Name param at least 10 letters")
super(Son,Son).name.__set__(self,value)
其中需要注意的是@Parent.name.setter和super(Parent,Parent).name.__set__(self,value)两处。
前者表示以Son类的name函数重设name描述符的set方法。
我们主要关注后面super(Son,Son)的用法,即其和一般的super(type,instance)的使用方式看似是不同的,实际上是一致的:都是取后者继承链上前者的后一位,只不过我们传入了类则不再需要根据instance去求出这个类;另一方面,描述符是定义在类上的,如果我们传入cls也是调用不到描述符的。
于此同时需要注意到像下面这样做是错误的-其name的setter会消失:
class Son2(Parent):
@property
def name(self):
print("Son2 getting name")
return super().name