《Python编程基础》课件-6.6.8属性描述符与属性管理_第1页
《Python编程基础》课件-6.6.8属性描述符与属性管理_第2页
《Python编程基础》课件-6.6.8属性描述符与属性管理_第3页
《Python编程基础》课件-6.6.8属性描述符与属性管理_第4页
《Python编程基础》课件-6.6.8属性描述符与属性管理_第5页
已阅读5页,还剩6页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

属性描述符与属性管理教学目标1.掌握实现描述符的基本方法

2.了解使用property装饰器管理属性

1、什么是属性描述符及其重要性属性描述符(PropertyDescriptors)是Python中一种高级机制,用于自定义类属性的访问、设置和删除行为,通过实现__get__、__set__和__delete__方法的对象来管理属性。核心概念:描述符协议通过__get__等方法拦截属性操作;数据描述符优先于实例属性;非数据描述符仅__get__;重要性在于属性控制和代码复用。#普通属性示例classNormalClass:#定义普通类def__init__(self):#初始化self.value=10#直接设置属性obj=NormalClass()#创建实例print(obj.value)#直接访问,输出10obj.value=20#直接修改,无控制#描述符概念:自定义访问(完整实现见后续页)classDescriptor:#描述符类def__get__(self,instance,owner):#获取时调用returnself._value#返回值def__set__(self,instance,value):#设置时调用self._value=value#存储值,可添加验证2.手动实现描述符的基本方法手动实现描述符的基本方法涉及定义一个类,实现__get__、__set__和可选__delete__方法,然后在目标类中作为类属性使用。这允许自定义属性行为,如添加类型检查或计算值。核心概念:get(self,instance,owner)处理读取;set(self,instance,value)处理写入;描述符存储在类中,影响所有实例。#手动描述符类classIntDescriptor:#定义描述符def__init__(self):#初始化self._value=0#默认值def__get__(self,instance,owner):#获取属性时调用returnself._value#返回存储值def__set__(self,instance,value):#设置属性时调用ifnotisinstance(value,int):#检查类型raiseValueError("Mustbeinteger")#抛出错误self._value=value#存储有效值核心概念:描述符可实现只读/计算属性;存储在实例__dict__中;简单示例突出拦截益处。3.属性描述符的简单代码示例#简单温度描述符classCelsius:#描述符类def__get__(self,instance,owner):#获取时转换returninstance._temp#返回摄氏def__set__(self,instance,value):#设置时存储instance._temp=value#私有存储classFahrenheit:#计算描述符def__get__(self,instance,owner):#获取时计算returninstance.celsius*1.8+32#转换华氏classTemp:#使用类celsius=Celsius()#存储描述符fahrenheit=Fahrenheit()#计算描述符#示例t=Temp()#实例t.celsius=0#设置摄氏print(t.fahrenheit)#输出32.0,计算得到property装饰器提供内置方式管理属性,通过@f.setter和@f.deleter定义getter/setter/delete行为。核心概念:property(fget,fset,fdel)创建描述符;装饰器语法简化;适用于实例方法。4.使用property装饰器管理属性classCircle:#类示例def__init__(self,radius):#初始化self._radius=radius#私有存储@property#getter装饰器defradius(self):#获取方法returnself._radius#返回值@radius.setter#setter装饰器defradius(self,value):#设置方法ifvalue<0:#验证raiseValueError("Radiusmustbepositive")self._radius=value#存储属性描述符用于数据验证、懒加载或依赖属性。核心概念:实际应用聚焦验证/计算;与dataclasses结合;场景如框架属性。5.属性描述符在实际场景中的应用classUser:#用户模型def__init__(self):#初始化self._email=None#私有classEmailDescriptor:#描述符def__get__(self,instance,owner):#获取returninstance._emaildef__set__(self,instance,value):#设置验证if'@'notinvalue:#检查格式raiseValueError("Invalidemail")instance._email=value#存储User.email=EmailDescriptor()#添加描述符#应用u=User()#实例u.email="user@"#成功print(u.email)#输出email循环引用描述符问题是Python中描述符持循环对象导致GC难回收的过程,通过weakref规避,确保释放而không依赖del。其问题<core>在于描述符长寿,并在实际中用于属性而không依赖gc.disable。核心概念:循环描述符问题;问题包括持长;描述符强调weakref。6.循环引用描述符问题importweakref#导入classDesc:#描述符def__get__(self,inst,owner):returnself._valdef__set__(self,inst,val):self._val=valclassCycle:attr=Desc()#类c=Cycle()#实例c.attr=[c]#循环wr=weakref.ref(c.attr)#弱规避delc#删除print(gc.collect())#回收print(wr())#None常见问题:__set__缺失导致只读;继承混淆。核心概念:优先级(数据>实例>非数据)。7.常见问题与最佳实践classBadDesc:#问题示例:无__set__def__get__(self,instance,owner):#只读return42classTest:#类attr=BadDesc()#描述符t=Test()#实例print(t.attr)#输出42#t.attr=10#AttributeError,无__set__#最佳:添加__set__classGoodDesc(BadDesc):#扩展def__set__(self,instance,v

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论