Python isinstance()与类、子类:装饰器类型判断及调用疑惑
问题解答
先帮你理清这两个问题的核心,都是围绕描述符类的实例化和装饰器逻辑展开的:
问题1:为什么String、Integer不满足isinstance(value, Descriptor),而SizedString满足?
这是因为你在Stock类里给属性赋值的对象类型完全不一样:
- 对于
name=String、shares=Integer,这里的String、Integer是类本身,不是它们的实例对象。isinstance()函数的作用是判断一个对象是否是某个类(或其子类)的实例,而类本身的类型是type,显然String作为类,并不是Descriptor的实例——它只是Descriptor的子类而已。 - 而
place=SizedString('tester',size=8)是直接创建了SizedString的实例对象,SizedString是Descriptor的子类,所以这个实例自然满足isinstance(value, Descriptor)的判断条件。
简单总结:子类的类对象 ≠ 子类的实例对象,isinstance只认实例是否属于该类层级。
问题2:装饰器else分支中的value(key)是什么含义?
这里的value指的是String、Integer这些描述符子类的类对象,value(key)就是调用这个类的构造方法,创建一个该类的实例——其中key就是当前处理的属性名(比如name、shares)。
装饰器的这个逻辑是为了补全描述符的实例化:因为你在Stock类里直接写name=String(用类而非实例),但描述符要正常工作必须是实例绑定在类属性上。所以装饰器帮你自动把这些描述符类转换成实例,把属性名作为参数传入构造方法,这样后续访问Stock.name时,才是一个能正常工作的描述符实例。
举个例子,处理name=String时,value(key)等价于String('name'),相当于手动写了name=String('name'),这样描述符就能知道它对应的是哪个属性名,方便后续做约束校验。
内容的提问来源于stack exchange,提问作者Joe_12345
相关产品推荐
相关产品推荐

