描述符核心概念
- 定义:将实现了
__get__/__set__/__delete__之一的类的实例,指派给另一个类的属性 - 特殊方法(描述符方法)
__get__(self, instance, owner):访问属性时触发__set__(self, instance, value):赋值属性时触发__delete__(self, instance):删除属性时触发
- 核心作用:控制另一个类中属性的访问、赋值、删除逻辑
描述符方法参数说明
self:描述符类自身的实例instance:拥有该属性的类的实例(如Test类的实例test)owner:拥有该属性的类本身(如Test类)value:赋值操作时等号右侧的值(仅__set__有)
property的本质:描述符类
- 原理:property是Python内置的描述符类,通过封装
__get__/__set__/__delete__实现属性管控 - 自定义my_property实现步骤
- 类初始化接收
f_get/f_set/f_delete三个方法参数 - 重写
__get__:调用self.f_get(instance)获取属性 - 重写
__set__:调用self.f_set(instance, value)设置属性 - 重写
__delete__:调用self.f_delete(instance)删除属性
- 类初始化接收
- 验证:替换类中property为my_property,功能完全一致
实战案例:温度转换类(描述符应用)
- 需求:定义Temperature类,支持摄氏度(celsius)和华氏度(fahrenheit)自动转换
- 转换公式:华氏度 = 摄氏度 × 1.8 + 32;摄氏度 = (华氏度 - 32) ÷ 1.8
- 实现步骤
- 定义Celsius描述符类
__init__:初始化温度值,默认26.0__get__:返回存储的摄氏度值__set__:接收浮点型温度值并存储
- 定义Fahrenheit描述符类
__get__:通过instance.celsius计算并返回华氏度__set__:通过公式反算摄氏度,赋值给instance.celsius
- 定义Temperature类
- 类属性celsius = Celsius()
- 类属性fahrenheit = Fahrenheit()
- 定义Celsius描述符类
- 效果:修改任一温度属性,另一属性自动同步转换