三大特征

封装

将一些基本数据类型复合成一个自定义类型,向类外提供必要的功能,隐藏实现的细节

  • 将数据与对数据的操作相关联
  • 代码可读性更高(类是对象的模板)

私有成员

  • 作用:无需向类外提供的成员,可以通过私有化进行屏蔽。
  • 做法:命名使用双下划线开头。
  • 本质:障眼法,实际也可以访问。私有成员的名称被修改为:类名__成员名,可以通过__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