三大特征
封装
将一些基本数据类型复合成一个自定义类型,向类外提供必要的功能,隐藏实现的细节
- 将数据与对数据的操作相关联
- 代码可读性更高(类是对象的模板)
私有成员
- 作用:无需向类外提供的成员,可以通过私有化进行屏蔽。
- 做法:命名使用双下划线开头。
- 本质:障眼法,实际也可以访问。私有成员的名称被修改为:
类名__成员名
,可以通过__dict__
属性查看
class MyClass:
def __init__(self, data):
self.__data = data
def __func01(self):
print("func01执行了")
m01 = MyClass(10)
# print(m01.__data) # 无法访问
print(m01._MyClass__data)
print(m01.__dict__) # {'_MyClass__data': 10}
# m01.__func01() # 无法访问
m01._MyClass__func01()
属性@property
- 保护实例变量
@property
def 属性名(self):
return self.__属性名
@属性名.setter
def 属性名(self, value):
self.__属性名= value
# 调用
#对象.属性名 = 数据
#变量 = 对象.属性名
三种形式
# 1. 读写属性
# 快捷键 props + 回车
class MyClass:
def __init__(self,data):
self.data = data
@property
def data(self):
return self.__data
@data.setter
def data(self, value):
self.__data = value
m01 = MyClass(10)
print(m01.data)
# 2. 只读属性
# 快捷键 prop + 回车
class MyClass:
def __init__(self):
self.__data = 10
@property
def data(self):
return self.__data
m01 = MyClass()
# m01.data = 20# AttributeError: can't set attribute
print(m01.data)
# 3. 只写属性
class MyClass:
def __init__(self, data):
self.data = data
# data = property()
# @data.setter
# def data(self, value):
# self.__data = value
def data(self, value):
self.__data = value
data = property(fset=data)
m01 = MyClass(10)
print(m01.data) # AttributeError: unreadable attribute
m01.data = 20
练习property
"""
练习1:创建敌人类,并保护数据在有效范围内
数据:姓名、攻击力、血量
0-100 0-500
"""
class PlayerModel:
def __init__(self,name='',ad=0,hp=0):
self.name = name
self.ad = ad
self.hp = hp
def set_ad(self, ad):
if ad < 0:
self.__ad = 0
elif ad > 100:
self.__ad = 100
else:
self.__ad = ad
def get_ad(self):
return self.__ad
ad = property(get_ad,set_ad)
def set_hp(self,hp):
if hp < 0:
self.__hp = 0
elif hp > 500:
self.__hp = 500
else:
self.__hp = hp
def get_hp(self):
return self.__hp
hp = property(get_hp, set_hp)
p1 = PlayerModel('p1',200,200)
print(p1.__dict__)
#{'name': 'p1', '_PlayerModel__ad': 100, '_PlayerModel__hp': 200}
#100
#200
最后一次更新于2022-10-18 16:36
0 条评论