封装
-
数据角度
将一些基本数据类型复合成一个自定义类型,将数据抽象之后封装起来
优势:
将数据与数据的操作相关联,代码可读性更高(类是对象的模板)
# 将商品数据抽象化 class Commodity: def __init__(self, cid=0, name="", price=0): self.cid = cid self.name = name self.price = price listCommodityInfo = [ Commodity(1000, "轩辕剑", 5000), Commodity(1001, "莫邪剑", 6000), Commodity(1002, "七龙珠", 9000) ] def PrintCommodity(commodity): print(f"商品ID:{commodity.cid},商品名称:{commodity.name},商品价格:{commodity.price}") def PrintCommodityInfo(): for Commodity in listCommodityInfo: PrintCommodity(Commodity) if __name__ == '__main__': PrintCommodityInfo()
-
行为角度
定义:向类外提供必要功能,隐藏实现细节。保障数据有效性
优势:简化编程,使用者不必交接具体现实细节
隐藏成员(私有成员):以双下划线开头的成员叫隐藏成员,类外无法访问,也可以叫私有成员,内部可以访问
本质是障眼法,看着双下划线命名,实际是单下划线类名+双下划线名:_MyClass__data
class Enemy: def __init__(self, name="", hp=0, atk=0, defense=0): self.name = name self.hp = hp self.atk = atk self.defense = defense @property def hp(self): return self.__hp @hp.setter def hp(self,value): if 0 <= value <= 100: self.__hp = value else: raise Exception("血量不符合要求!") @property def atk(self): return self.__atk @atk.setter def atk(self,value): if 0 <= value <= 200: self.__atk = value else: raise Exception("攻击力不符合标准") # 属性,保护实例变量 # 属性名与实例变量名称相同 # 属性中操作私有变量 # 核心:覆盖拦截 """ @property 装饰器,可以拆分成三步 (1)property()创建属性对象 (2)将下面函数作为参数传给property。property(defense) (3)将属性对象交给变量名关联defense """ @property def defense(self): return self.__defense @defense.setter # 此时defense是经过property装饰过函数 # defense.setter(设置函数),调用下面函数作为参数 def defense(self,value): if 0 <= value <= 200: self.__defense = value else: raise Exception("防御力不符合标准") e01 = Enemy("灭霸", 100, 60, 1200) print(f"{e01.name},血量{e01.hp},攻击力{e01.atk},防御力{e01.defense}")
-
设计角度