小甲鱼Python学习笔记

描述符核心概念

  • 定义:将实现了__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实现步骤
    1. 类初始化接收f_get/f_set/f_delete三个方法参数
    2. 重写__get__:调用self.f_get(instance)获取属性
    3. 重写__set__:调用self.f_set(instance, value)设置属性
    4. 重写__delete__:调用self.f_delete(instance)删除属性
  • 验证:替换类中property为my_property,功能完全一致

实战案例:温度转换类(描述符应用)

  • 需求:定义Temperature类,支持摄氏度(celsius)和华氏度(fahrenheit)自动转换
  • 转换公式:华氏度 = 摄氏度 × 1.8 + 32;摄氏度 = (华氏度 - 32) ÷ 1.8
  • 实现步骤
    1. 定义Celsius描述符类
      • __init__:初始化温度值,默认26.0
      • __get__:返回存储的摄氏度值
      • __set__:接收浮点型温度值并存储
    2. 定义Fahrenheit描述符类
      • __get__:通过instance.celsius计算并返回华氏度
      • __set__:通过公式反算摄氏度,赋值给instance.celsius
    3. 定义Temperature类
      • 类属性celsius = Celsius()
      • 类属性fahrenheit = Fahrenheit()
  • 效果:修改任一温度属性,另一属性自动同步转换