python的描述器descriptor详解.docx

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多

python的描述器descriptor详解

目录基本说明示例Demo1示例Demo2示例Demo3示例Demo4

基本说明

Python的描述器(descriptor)是一种Python对象,可以通过定义一组特定的方法来管理另一个对象的访问。描述器可以用于控制属性的读取、写入和删除等操作,同时还可以用于实现计算属性、类属性、属性别名等高级功能。

在Python中,描述器是通过实现__get__()、__set__()和__delete__()方法的对象来定义的。当一个描述器被绑定到一个类的属性上时,Python会自动将其转化为描述器对象,并在访问该属性时调用对应的描述器方法。

classDescriptor:

def__get__(self,instance,owner):

print(Gettingthevalue)

returnself.value

def__set__(self,instance,value):

print(Settingthevalue)

self.value=value

classMyClass:

attr=Descriptor()

obj=MyClass()

obj.attr=42

print(obj.attr)

描述器是一种强大的Python语言特性,可以用于实现各种高级功能,例如:

计算属性:描述器可以根据其他属性的值动态计算出一个属性的值,而不是存储属性的值。这可以帮助我们简化代码,并且可以在不改变接口的情况下改变属性的实现方式。类属性:描述器可以让我们将属性绑定到类上,而不是绑定到实例上。这可以让我们在所有实例之间共享属性值,并且可以在运行时动态更改属性的值。属性别名:描述器可以让我们定义一个属性的别名,让一个属性具有多个名称。这可以帮助我们简化代码,并且可以在不改变接口的情况下更改属性的名称。数据验证:描述器可以让我们在设置属性值之前验证输入数据,确保它们符合我们的预期格式和类型。这可以提高代码的健壮性,并且可以帮助我们避免一些常见的错误。

示例Demo1

假设我们有一个Temperature类,用于表示温度。该类有一个名为celsius的属性,表示摄氏温度。我们希望实现以下功能:

计算属性fahrenheit,表示华氏温度,它应该是一个只读属性,可以通过摄氏温度自动计算得出。限制celsius属性的取值范围在-273.15℃到1000℃之间,如果尝试设置超出此范围的值,应该引发ValueError异常。

下面是使用描述器实现以上功能的示例代码:

classCelsius:

def__init__(self,value=0.0):

self._value=value

def__get__(self,instance,owner):

returnself._value

def__set__(self,instance,value):

ifvalue-273.15orvalue1000.0:

raiseValueError(Temperatureoutofrange)

self._value=value

classTemperature:

celsius=Celsius()

@property

deffahrenheit(self):

returnself.celsius*1.8+32

在这个示例中,我们定义了一个Celsius类,它是一个描述器,用于限制Temperature类的celsius属性的取值范围。在Celsius类中,我们实现了__get__()和__set__()方法,分别在读取和设置celsius属性时被调用。在__set__()方法中,我们检查输入的值是否在允许的范围内,如果不是,则引发一个异常。

然后,我们定义了一个Temperature类,它有一个celsius属性,它被绑定到Celsius类的实例上。我们还定义了一个只读属性fahrenheit,它可以通过celsius属性自动计算得出。

现在,我们可以创建一个Temperature对象,并设置其celsius属性,如下所示:

t=Temperature()

t.celsius=25.0

print(t.celsius)#输出25.0

print(t.fahrenheit)#输出77.0

在这个示例中,我们创建了一个Temperature对象,并将其celsius属性设置为25.0。然后,我们

文档评论(0)

139****7676 + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档