# 子类中扩展父类描述符

# 概述

当一个类定义了一个描述符时,该描述符只能在该类的实例中被访问,并且不会被子类继承。例如:

这里暂时存疑

当我们想对父类的描述符进行扩展时,可以采取如下的方式:

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