Python中类的属性精讲


前言

  本篇中介绍的属性上篇博客中提到的类属性和实例属性不同。之前介绍的属性将返回所存储的值,而本篇要介绍的属性则是一种特殊的属性,访问它时将计算它的值。另外,该属性还可以为属性添加安全保护机制


一、创建用于计算的属性

  在 Python 中,可以通过 @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)  # 获取属性值

  运行结果如下所示:

在这里插入图片描述

  如果将代码中倒数第二行的 ‘红旗渠’ 改为 ‘人民的名义’,运行后将显示如下效果:

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/2201_75641637/article/details/129503486
今日推荐