Python基础-面向对象编程之特性(property)
创始人
2024-02-16 07:19:12
0

Python面向对象编程之特性(property)

一、统一访问原则

通常,我们访问实例或类的属性时,将返回所存储的相关值。而特性(property)是一种特殊的属性,访问它时会计算它的值。

请看下面的例子:

import mathclass Circle():def __init__(self, radius):self.radius = radius  # 保存半径# Circle的一些附加特性@propertydef area(self):return math.pi * self.radius**2@propertydef perimeter(self):return 2 * math.pi * self.radiusif __name__ == '__main__':c = Circle(4.0)print(f'圆的半径为:{c.radius}')print(f'圆的面积为:{c.area}')print(f'圆的周长为:{c.perimeter}')

运行效果如下:

20221126005942

从这个例子中,我们可以看到,Circle实例存储了一个变量c.radius。而c.area和c.perimeter是根据该值计算得来的。@property装饰器支持以简单属性的形式访问后面的方法,无需像平时一样添加额外的()来调用该方法。对象的使用者很难发现正在计算一个属性,除非在试图重新定义该属性时生成了错误消息。

这种特性使用方式遵循所谓的统一访问原则。实际上,如果定义一个类,尽可能保持编程接口的统一总是不错的。如果没有特性(property),将会以简单属性(如c.radius)的形式访问对象的某些属性,而其他属性将以方法(如c.area())的形式进行访问。费力去了解何时添加额外的()会带来不必要的混淆。而特性可以解决此问题。

二、使用特性进行拦截操作

特性(property)还可以拦截操作,以设置和删除属性。这是通过向特性附加其他的setter和deleter方法来实现的,比如下面的代码:

class Foo():def __init__(self, name):self.__name = name@propertydef name(self):return self.__name@name.setterdef name(self, value):if not isinstance(value, str):raise TypeError('must be a string')self.__name = value@name.deleterdef name(self):raise TypeError('cannot delete name')f = Foo('lilei')
n = f.name            # 调用f.name() get函数
f.name = 'hanmeimei'  # 调用setter name(f, 'hanmeimei')
f.name = 14           # 调用setter name(f, 45)  -> TypeError
del f.name            # 调用deleter name(f)     -> TypeError

在这个例子中,实现使用@property装饰器和相关方法将属性name定义为只读特性。后面的@name.setter和@name.deleter装饰器将其他方法与name属性上的设置和删除操作相关联。这些方法的名称必须与原始特性的名称完全匹配。在这些方法中,请注意实际的名称值是存储在属性self.__name中。所存储属性的名称无需遵循任何约定,但它必须与特性名称不同,以便将它与特性的名称区分开来。

三、老式写法

以前的老代码中可能还会看到以下这种写法:

class Foo():def getname(self):return self.__namedef setname(self, value):self.__name = valuedef delname(self):raise TypeError('cannot delete name')name = property(getname, setname, delname)

这种老的写法仍然可用,但新的装饰器版本会让类看起来更完美一些。例如,如果使用装饰器,get、set、delete这些函数将不会显示为方法。

相关内容

热门资讯

喜欢穿一身黑的男生性格(喜欢穿... 今天百科达人给各位分享喜欢穿一身黑的男生性格的知识,其中也会对喜欢穿一身黑衣服的男人人好相处吗进行解...
发春是什么意思(思春和发春是什... 本篇文章极速百科给大家谈谈发春是什么意思,以及思春和发春是什么意思对应的知识点,希望对各位有所帮助,...
网络用语zl是什么意思(zl是... 今天给各位分享网络用语zl是什么意思的知识,其中也会对zl是啥意思是什么网络用语进行解释,如果能碰巧...
为什么酷狗音乐自己唱的歌不能下... 本篇文章极速百科小编给大家谈谈为什么酷狗音乐自己唱的歌不能下载到本地?,以及为什么酷狗下载的歌曲不是...
家里可以做假山养金鱼吗(假山能... 今天百科达人给各位分享家里可以做假山养金鱼吗的知识,其中也会对假山能放鱼缸里吗进行解释,如果能碰巧解...
华为下载未安装的文件去哪找(华... 今天百科达人给各位分享华为下载未安装的文件去哪找的知识,其中也会对华为下载未安装的文件去哪找到进行解...
四分五裂是什么生肖什么动物(四... 本篇文章极速百科小编给大家谈谈四分五裂是什么生肖什么动物,以及四分五裂打一生肖是什么对应的知识点,希...
怎么往应用助手里添加应用(应用... 今天百科达人给各位分享怎么往应用助手里添加应用的知识,其中也会对应用助手怎么添加微信进行解释,如果能...
苏州离哪个飞机场近(苏州离哪个... 本篇文章极速百科小编给大家谈谈苏州离哪个飞机场近,以及苏州离哪个飞机场近点对应的知识点,希望对各位有...
客厅放八骏马摆件可以吗(家里摆... 今天给各位分享客厅放八骏马摆件可以吗的知识,其中也会对家里摆八骏马摆件好吗进行解释,如果能碰巧解决你...