自学python如何成为大佬(目录):https://blog.csdn.net/weixin_67859959/article/details/139049996?spm=1001.2014.3001.5501
1 创建用于计算的属性
在Python中,可以通过@property(装饰器)将一个方法转换为属性,从而实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,而不需要再添加一对小括号“()”,这样可以让代码更加简洁。
通过@property创建用于计算的属性的语法格式如下:
@property
def methodname(self):
block
参数说明:
l methodname:用于指定方法名,一般使用小写字母开头。该名称最后将作为创建的属性名。
l self:必要参数,表示类的实例。
l 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(800,600) # 创建类的实例
print("面积为:",rect.area) # 输出属性的值
运行上面的代码,将显示以下运行结果:
面积为: 480000
注意:通过@property转换后的属性不能重新赋值,如果对其重新赋值,将抛出如图14所示的异常信息。
图14 AttributeError异常
2 为属性添加安全保护机制
在Python中,默认情况下,创建的类属性或者实例是可以在类体外进行修改的,如果想要限制其不能在类体外修改,可以将其设置为私有的,但设置为私有后,在类体外也不能直接通过实例名+属性名获取它的值。如果想要创建一个可以读取但不能修改的属性,那么可以使用@property实现只读属性。
例如,创建一个电视节目类TVshow,再创建一个show属性,用于显示当前播放的电视节目,代码如下:
class TVshow: # 定义电视节目类
def __init__(self,show):
self.__show = show
@property # 将方法转换为属性
def show(self): # 定义show()方法
return self.__show # 返回私有属性的值
tvshow = TVshow("正在播放《战狼2》") # 创建类的实例
print("默认:",tvshow.show) # 获取属性值
执行上面的代码,将显示以下内容:
默认: 正在播放《战狼2》
通过上面的方法创建的show属性是只读的,尝试修改该属性的值,再重新获取。在上面代码中添加以下代码:
tvshow.show = "正在播放《红海行动》" # 修改属性值
print("修改后:",tvshow.show) # 获取属性值
运行后,将显示如图15所示的运行结果,其中红字的异常信息就是修改属性show时抛出的异常。
图15 修改只读属性时抛出的异常
通过属性不仅可以将属性设置为只读属性,而且可以为属性设置拦截器,即允许对属性进行修改,但修改时需要遵守一定的约束。
场景模拟:某电视台开设了电影点播功能,但要求只能从指定的几个电影(如《战狼2》《红海行动》《西游记女儿国》《熊出没・变形记》)中选择一个。
实例03 在模拟电影点播功能时应用属性
在IDLE中创建一个名称为film.py的文件,然后在该文件中定义一个电视节目类TVshow,并在该类中定义一个类属性,用于保存电影列表,然后在__init__()方法中定义一个私有的实例属性,再将该属性转换为可读取、可修改(有条件进行)的属性,最后创建类的实例,并获取和修改属性值,代码如下:
class TVshow: # 定义电视节目类
list_film = ["战狼2","红海行动","西游记女儿国","熊出没・变形记"]
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_film: # 判断值是否在列表中
self.__show = "您选择了《" + value + "》,稍后将播放" # 返回修改的值
else:
self.__show = "您点播的电影不存在"
tvshow = TVshow("战狼2") # 创建类的实例
print("正在播放:《",tvshow.show,"》") # 获取属性值
print("您可以从",tvshow.list_film,"中选择要点播放的电影")
tvshow.show = "红海行动" # 修改属性值
print(tvshow.show) # 获取属性值
运行结果如图16所示。
图16 模拟电影点播功能
如果将第17行代码中的“红海行动”修改为“流浪地球”,将显示如图17所示的效果。
图17 要点播的电影不存在的效果