我们的目标是:通过这一套资料学习下来,通过熟练掌握python基础,然后结合经典实例、实践相结合,使我们完全掌握python,并做到独立完成项目开发的能力。
上篇文章我们讨论了类的定义、使用方法的相关知识。今天我们将学习一下类的属性(property)。
本次要介绍的属性是一种特殊的属性,访问它时将计算它的值。另外,该属性还可以为属性添加安全包含机制。
1、创建用于计算的属性(@property)
在python中,可以通过@property(装饰器)将一个方法转换为属性,以实现用于计算的属性。将方法转换为属性后,可以直接通过方法名来访问方法,无需使用“()”。
使用语法: @property
def methodname(self):
block
参数说明:methodname-----指定方法名,一般小写字母开头,后面作为创建的属性名
self -----必要参数,表示类的实例
block ---方法体,实现的具体功能。通常以return 语句结束,返回计算结果
举例说明:
#计算长方形类,@property 方法转换为属性用于计算
class Rect_area:
def __init__(self,long,width):
self.long = long
self.width = width
@property
def area(self):
return self.long*self.width
rect1 = Rect_area(5,4)
print("长方形的面积:",rect1.area)
输出结果:20
注意:通过@property 修饰后不能重新赋值,如下会报错:
2、为属性添加保护机制(@property)
在python中,默认情况下,创建的属性或者实例是可以在类体外进行修改的。如果想要限制类体外不可修改。可以将它设置为私有,但将它设置为私有后,在类体外就无法获取它的值。若是想创建一个可以被读取,但不可以被修改的属性,可以使用@property 实现只读属性。
1)设置只读属性
举例说明:
#播放音乐的例子
class MusicPlay:
def __init__(self,play):
self.__play = play #加双下划线表示私有类型属性
@property
def play(self):
return self.__play #返回私有属性的值
musicPlay = MusicPlay("正在播放《青花瓷》")
print("默认:",musicPlay.play) #获取属性值
musicPlay.play = "正在播放《知心爱人》"
输出结果:
可以看到最后一行编码报错,修改只读属性时报错。
2)只读属性设置setter方法修改
另外,参考上面报错的提示,若想修改,可以设置setter 方法让属性可以修改,
参考例子:
#播放音乐的例子
class MusicPlay:
music_list=["青花瓷","知心爱人","忘情水"]
def __init__(self,play):
self.__play = play #加双下划线表示私有类型属性
@property
def play(self):
return self.__play #返回私有属性的值
@play.setter
def play(self,value):
if value in MusicPlay.music_list:
self.__play = "你选择了《"+value+"》,稍后播放"
else:
self.__play = "你选择的歌曲不存在"
musicPlay = MusicPlay("青花瓷")
print("正在播放:《",musicPlay.play,"》") #获取属性值,其中,就是连接字符串
print("你可以从",musicPlay.music_list,"中选择要听的音乐")
musicPlay.play = "忘情水" #修改属性值
print(musicPlay.play) #获取修改后的属性值
输出结果参考:
3、删除属性的deleter方法
和setter 方法类似,当我们需要删除一个属性时,我们会使用deleter 方法。
#播放音乐的例子(黄色阴影部分为删除属性相关操作)
class MusicPlay:
music_list=["青花瓷","知心爱人","忘情水"]
def __init__(self,play):
self.__play = play #加双下划线表示私有类型属性
@property
def play(self):
return self.__play #返回私有属性的值
@play.setter
def play(self,value):
if value in MusicPlay.music_list:
self.__play = "你选择了《"+value+"》,稍后播放"
else:
self.__play = "你选择的歌曲不存在"
@play.deleter
def play(self):
self.__play =None
musicPlay = MusicPlay("青花瓷")
print("正在播放:《",musicPlay.play,"》") #获取属性值,其中,就是连接字符串
print("你可以从",musicPlay.music_list,"中选择要听的音乐")
musicPlay.play = "忘情水" #修改属性值
print(musicPlay.play) #获取修改后的属性值
del musicPlay.play
print(musicPlay.play) #再次获取删除后的属性值:None
输出结果参考:
今天先写学习到这里了,每天进步一点点。明天也要加油啊!