文章目录
- 前言
- 一、创建用于计算的属性
- 二、为属性添加安全保护机制
前言
属性与上篇博客中提到的类属性和实例属性不同。之前介绍的属性将返回所存储的值,而本篇要介绍的属性则是一种特殊的属性,访问它时将计算它的值。另外,该属性还可以为属性添加安全保护机制。
一、创建用于计算的属性
@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号 “()”,这样可以让代码更加简洁。
@property
@property
def methodname(self):
block
参数说明:
- methodname:用于指定方法名,一般使用小写字母开头。该名称最后将作为创建的属性名。
- self:必要参数,表示类的实例。
- block:方法体,实现的具体功能。在方法体中,通常以 return 语句结束,用于返回计算结果。
例如,定义一个矩形类,在 _ _ init _ _ () 方法中定义两个实例属性,然后再定义一个计算矩形面积的方法,并应用 @property 将其转换为属性,最后创建类的实例,并访问转换后的属性,代码如下:
class Rect:
def __init__(self, width, height):
self.width = width # 矩形的宽
self.height = height # 矩形的高
@property # 将方法转换为属性
def area(self): # 计算矩形面积的方法
return self.width * self.height # 返回矩形的面积
rect = Rect(10, 20) # 创建类的实例
print('矩形的面积为:', rect.area) # 输出属性的值
运行上面代码后,结果如下:
矩形的面积为: 200
注意:通过 @property 转换后的属性不能重新赋值,如果对其重新赋值,将会报错如下图所示。
二、为属性添加安全保护机制
在 Python 中,默认情况下,创建的类属性或者实例是可以在类体外进行修改的,如果想要限制其不能在类体外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能直接通过实例名+属性名获取它的值。如果想要创建一个可以读取但不能修改的属性,那么可以使用 @property 实现只读属性。
例如,创建一个电视节目类 TvShow,再创建一个 show 属性,用于显示当前播放的电视节目,代码及执行结果如下图所示:
通过上面的方法创建的 show 属性是只读的,尝试修改该属性的值,再重新获取。则会报错如下图所示:
通过属性不仅可以将属性设置为只读属性,而且可以为属性设置拦截器,即允许对属性进行修改,但修改时需要遵守一定的约束。例如,在上述代码上做一些改动,允许用户修改点播节目,但是只能从指定的几个电视剧中选择一个。代码如下所示:
class TvShow: # 定义电视节目类
list_show = ['县委书记', '红旗渠', '安居', '幸福里的春天', '狂飙']
def __init__(self, show):
self.__show = show
@property # 将方法转换为属性
def show(self): # 定义show()方法
return self.__show # 返回私有属性的值
@show.setter # 设置setter方法,让属性可修改
def show(self, value):
if value in TvShow.list_show:
self.__show = '您选择了《{}》,稍后将播放'.format(value)
else:
self.__show = '您点播的电视剧不存在'
tvshow = TvShow('狂飙') # 创建类的实例
print('正在播放:', tvshow.show) # 获取属性值
print('您可以从{}中选择要播放的电视剧'.format(tvshow.list_show))
tvshow.show = '红旗渠' # 修改属性值
print(tvshow.show) # 获取属性值
运行结果如下所示:
如果将代码中倒数第二行的 ‘红旗渠’ 改为 ‘人民的名义’,运行后将显示如下效果: