1、面向对象和面向过程
面向过程:核心过程二字,过程即解决问题的步骤,就是先干什么后干什么 基于该思想写程序就好比在这是一条流水线,是一种机械式的思维方式 优点:复杂的过程流程化 缺点:扩展性差 面向对象:核心是对象二字,对象指特征与技能的结合体 基于该思想编写程序就好比在创造一个世界,世界是由一个个对象组成,是一种‘上帝式’的思维方式 优点:可扩展性强 缺点:变成复杂度高,极容易出现过度设计的问题 2、类 对象是特征与技能的结合体,类就是一系列对象相似的特征与技能的结合体 在现实生活中:一定是先有一个个具体的对象,后总结出类 在程序中:一定是先定义类,后产生对象
封装介绍:
1.封装是面相对性一大特点 2.面向对象编程的第一步--将属性和方法封装到一个抽象的类当中 3.外界使用类创建对象,然后让对象调用方法 4.对象方法的细节都被封装在类的内部
封装案例一:小明
需求 # 1.小明体重75公斤 # 2.小明每次跑步都会减肥0.5公斤 # 3.小明每次吃东西体重会增加1公斤 # class Human: # def __init__(self,name,weight): # self.name = name #属性:名字和体重 # self.weight = weight # # def run(self): # self.weight -= 0.5 #每跑一次步就瘦0.5 # def eat(self): # self.weight += 1 #吃一次胖1 # def __str__(self): # return '%s的体重为%s' %(self.name,self.weight) # xm = Human('小明',75) # xm.eat() # xm.run() # print(Human) ——》实例化什么就打印什么 #当使用print输出对象的时候,只要自己定义了__str__(self)方法,那么就会打印从在这个方法中return的数据
案列二:房子添加家具
# 1、房子有户型、总面积、家具名称列表 # 房子没有任何家具 # 2、家具有名字和占地面积,其中 # 席梦思(bed):4平米 # 衣柜(chest): 2平米 # 餐桌(table): 1.5平米 # 3、将以上3个家具添加到房子中 # 4、打印房子中,要求输出:户型、总面积、剩余面积、家具名称列表 class Items: def __init__(self,name,area): self.name = name self.area = area class House: def __init__(self,type,z): #剩余面积self.f可以根据总面积-家具面积得到,所以不需要设置变量 self.type = type self.z = z self.f = z self.list = [] #家具列表为空 def add(self,jj): self.list.append(jj.name) #已经定义过家具的属性,可以直接用 self.f -= jj.area def __str__(self): return '户型为%s,总面积为%s,剩余面积为%s,家具列表名称为%s' %(self.type,self.z,self.f,self.list) #使用return bed = Items('木板床',4) chest = Items('衣柜',2) table = Items('桌子',1.5) h = House('地下室',20) #以上四步都是实例化 h.add(bed) h.add(chest) print(h) #直接打印实例化目标
案例三:士兵突击
class Gun: --->先定义枪类型 def __init__(self,mode,count): ---》属性为类型和子弹数量 self.mode = mode self.count = 0 ---》初始子弹数量为0 def shoot(self,number): ----》枪的技能1发射,子弹剩余量=总弹数-发射的数量(不定) self.count -= number def add_count(self,number): ----》枪的技能2装子弹,子弹剩余量= 装入与发射的差 self.count += number class Soldier: ----》定义士兵类型 def __init__(self,name): self.name = name ---》属性1姓名 gun = None ----》属性2 枪 def fire(self,count): count = n.count ---》定义士兵的枪的子弹数量为上面枪剩余子弹数 if count > 0: ----》大于0允许开炮,否则不允许 print('你持有ak47,子弹数量是%s,可以开炮' %count) else: print ('没有子弹了,不可以开炮') n = Gun('ak47',0) ----》定义枪类型的对象为n,n的名字是ak47 n.add_count(int(input('装入子弹数:'))) ----》自定义装入子弹数 n.shoot(int(input('射出子弹数:'))) ----》自定义射出子弹数 s = Soldier('许三多') ---》定义士兵类型为许三多 print(s.fire(n.count)) ----》根据士兵手里的ak是否有子弹来输出是否可以开炮