property
属性 与 类属性和实例属性不同,差异点在于:
property
属性,在访问时将计算它的值并返回,是动态的,更类似于方法@property
来把方法转换为属性,从而实现可以计算的属性,也把 @property
称作装饰器@property
方法创建的属性,其值不可以修改,为只读属性这种方法的优点是可以直接通过方法名来访问方法,且不需要添加小括号,语法如下:
@property
def methodName(self):block # 方法体通常需要用 return 语句返回计算结果
示例如下:
class Rect:def __init__(self, width, height): # 构造方法self.width = width # 矩形的宽度self.height = height # 矩形的高度@property # 装饰器,将方法变为属性def area(self): # 定义一个面积计算方法return self.width*self.height # 计算矩形面积,并通过 return 返回计算结果
rect = Rect(800,600) # 创建类的实例
print('面积为:',rect.area) #输出面积
# 输出结果为 “ 面积为: 480000 ”rect.area = 100 # 为属性重新赋值
print('面积为:',rect.area) #输出面积
# 以上重新赋值的语句运行将会报错
# 故 @property 创建的属性不可以更改(可以理解为 只读属性)
创建私有类型属性 __foo
可以一定程度上对属性进行保护,但此方法存在缺陷:设置为私有后,在类体外不能访问属性(不可修改,也不可读取)
而利用装饰器 @property
可以创建可以读取但是不能修改值的属性(只读属性),以下示例进行介绍:
class TVshow: # 电视节目类def __init__(self,show):self.__show = show@propertydef show(self): # 创建 show 方法return self.__show # 返回私有属性tvshow = TVshow('正在播放《战狼2》') # 创建类的实例
print('默认',tvshow.show) # 获取属性值# 以下代码测试 修改TVshow.show 属性,实际测试时报错,表面属性不可修改
tvshow.show = '正在播放《红海行动》'
print('默认',tvshow.show)
运行后,输出结果如下:
默认: 正在播放《战狼2》
Traceback (most recent call last): #以下为报错信息File "C:Users风转砂Desktop 0 Python 学习为属性添加保护机制.py", line 19, in <module>tvshow.show = '正在播放《红海行动》'
AttributeError: can't set attribute
案例学习:
一家电影院,只能点播节目单上的节目,点播其它节目时报错提醒。
class TVshow: # 电视节目类list_film = ['战狼2','红海行动','西游记','熊出没']def __init__(self,show):self.__show = show@propertydef 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) # 获取属性值
运行后,输出结果如下:
正在播放:《 战狼2》
您可以从 ['战狼2', '红海行动', '西游记', '熊出没'] 中选择您要点播的电影
您选择了《红海行动》,稍后将播放
class ClassName(baseClassList): ''' 类的帮助信息 '''statement
baseClassList
要继承的基类,多个基类之间可以用 逗号 “,”
间隔;如果不指定则默认继承 object
class Fruit:color = '绿色' # 类属性,水果的默认颜色def harvest(self, color):print('水果是:', color, '的!') # 输出形式参数 colorprint('水果已经收获……')print('水果原来是:', lor, '的!')class Apple(Fruit): #定义一个子类 苹果color = '红色'def __init__(self):print('我是苹果')class Orange(Fruit): #定义一个子类 橘子color = '橙色'def __init__(self):print('我是橘子')apple = Apple() # 创建苹果类的实例
apple.lor) # 调用基类的 harvest() 方法orange = Orange() # 创建橘子类的实例
orange.lor) # 调用基类的 harvest() 方法
运行结果
我是苹果
水果是: 红色 的!
水果已经收获……
水果原来是: 绿色 的!
我是橘子
水果是: 橙色 的!
水果已经收获……
水果原来是: 绿色 的!
基类(父类)的属性和方法可以被派生类(子类)继承,但是父类中的某些方法并不能完全适用于子类中,此时就需要在子类进行重写父类的方法。
class Fruit:color = '绿色' # 类属性,水果的默认颜色def harvest(self, color):print('水果是:', color, '的!') # 输出形式参数 colorprint('水果已经收获……')print('水果原来是:', lor, '的!')class Apple(Fruit): #定义一个子类 苹果color = '红色'def __init__(self):print('我是苹果')def harvest(self, color):print('苹果是:', color, '的!') # 输出形式参数 colorprint('苹果已经收获……')print('苹果原来是:', lor, '的!')class Orange(Fruit): #定义一个子类 橘子color = '橙色'def __init__(self):print('我是橘子')def harvest(self, color):print('橘子是:', color, '的!') # 输出形式参数 colorprint('橘子已经收获……')print('橘子原来是:', lor, '的!')apple = Apple() # 创建苹果类的实例
apple.lor) # 调用基类的 harvest() 方法orange = Orange() # 创建橘子类的实例
orange.lor) # 调用基类的 harvest() 方法
运行输出:
我是苹果
苹果是: 红色 的!
苹果已经收获……
苹果原来是: 绿色 的!
我是橘子
橘子是: 橙色 的!
橘子已经收获……
橘子原来是: 绿色 的!
__init__()
class Fruit:def __init__(self, color='绿色'):lor = color #类属性def harvest(self, color):print('水果是:', color, '的!') # 输出形式参数 colorprint('水果已经收获……')print('水果原来是:', lor, '的!')class Apple(Fruit): #定义一个子类 苹果color = '红色'def __init__(self): # 尝试对比 将子类的构造方法注释掉的运行结果print('我是苹果')def harvest(self, color):print('苹果是:', color, '的!') # 输出形式参数 colorprint('苹果已经收获……')print('苹果原来是:', lor, '的!')class Orange(Fruit): #定义一个子类 橘子color = '橙色'def __init__(self):print('我是橘子')def harvest(self, color):print('橘子是:', color, '的!') # 输出形式参数 colorprint('橘子已经收获……')print('橘子原来是:', lor, '的!')
super().__init__()
的方法来实现
class Fruit:def __init__(self, color='绿色'):lor = color #类属性def harvest(self, color):print('水果是:', color, '的!') # 输出形式参数 colorprint('水果已经收获……')print('水果原来是:', lor, '的!')class Apple(Fruit): #定义一个子类 苹果color = '红色'def __init__(self):print('我是苹果')super().__init__() # 调用父类的 构造方法def harvest(self, color):print('苹果是:', color, '的!') # 输出形式参数 colorprint('苹果已经收获……')print('苹果原来是:', lor, '的!')class Orange(Fruit): #定义一个子类 苹果color = '橙色'def __init__(self):print('我是橘子')super().__init__() # 调用父类的 构造方法def harvest(self, color):print('橘子是:', color, '的!') # 输出形式参数 colorprint('橘子已经收获……')print('橘子原来是:', lor, '的!')apple = Apple() # 创建苹果类的实例
apple.lor) # 调用基类的 harvest() 方法orange = Orange() # 创建橘子类的实例
orange.lor) # 调用基类的 harvest() 方法
本文发布于:2024-01-27 21:41:28,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17063628882798.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |