例子:#对象 张飞 男 18 初始战斗力 1000 #对象 吕布 男 20 初始战斗力 21000 #对象 曹操张飞 男 1918 初始战斗力 251000 #场景 # 草丛战斗 消耗 200 战斗力 # 自我修炼 增长100战斗力 # 多人对战 消耗 500战斗力 # 1.类===》人类 (属性:name gender age fight) # 方法 草丛战斗 grassfand # 自我修炼 practice # 多人对战 incest # 2.对象(从类模板 取出具体的事物) # 3.调用方法 class person: #构造函数 ===>专门为产生对象服务,不用显式调用,而是通过类名隐式调用 def __init__(self,na,gen,age,fig): #小括号中是构造函数的形参,只有self后的变量才代表属性 #问什么时候有实参,在构造对象的时候传递实参 self.name=na self.gender=gen self.age=age self.fight=fig print(self.name,"产生了") def grassland(self): self.fight-=200 def practice(self): self.fight+=100 def incest(self): self.fight-=500 #封装一个方法=>查看对象的属性值 def info(self): # print("姓名,性别,年龄,战斗力",self.name,self.gender,self.age,self.fight) #扩展----变量和常量混合输出 ==>占位符号 %s准备输出一个字符串 %d准备输出一个整数 %f代表小数 #占位符号%(变量)--对应关系 print("姓名:%s,性别%s,年龄%d,战斗力%d"%(self.name,self.gender,self.age,self.fight)) #构造对象===》具体的事物 zhang = person("张飞",'男',18,1000) lv = person("吕布", '男', 20, 2000) cao = person("曹操", '男', 19, 2500) zhang.info() lv.info() cao.info() print("==========玩游戏中===========") zhang.incest() lv.practice() zhang.grassland() zhang.incest() lv.practice() zhang.grassland() print("==========玩游戏结束===========") zhang.info() lv.info() cao.info()
面向对象设计代码(脚本思路)====》封装继承多态
需求 人类(个人信息属性一般不公开 name age grade),选择部分属性公开(name.age),选择属性不公开(grade)
解决:使用面向对象的封装特征,可以将类中的属性封闭起来,不让任意访问
(python属性私有化语法:在类中属性前面加上两个下划线)
总结封装 1.对象属性私有化 属性上加上两个下划线
2.部分属性可以访问 对属性增加set get方法
继承--面向对象的特征:
例子:动物类(姓名 睡觉 吼叫)
猫类 狗类 猴子类==》子类满足使用(继承)动物类特征
1.类的继承 子类是指在现有类的基础上 构造出新的类
2.子类可以使用父类的属性和方法(私有属性除外)
3.优点:增强代码的复用性
格式Class子类(父类)
#父类 class Animal: def __init__(self,name): self.name=name def sleep(self): print(self.name,"在睡觉") def shout(self): print(self.name,"在大叫") #子类 class cat(Animal): pass #子类2 class dog(Animal): pass #子类3 class monkey(Animal): pass #实例化 cc=cat("波斯猫") print("猫的名字",cc.name) cc.sleep() cc.shout() dd=dog("哈士奇") print("狗的名字",dd.name) dd.sleep() dd.shout() mm=monkey("金丝猴波斯猫") print("hou的名字",mm.name) mm.sleep() mm.shout()
问题==》吼叫 猫 够 猴子 一致了(强调个性)父类强调共性
解决==》对需要实现个性的代码 在子类中重新编写(重写 使用子类里面的方法覆盖父类中的方法+子类中方法的名字和父类中方法的名字是一致的)
#父类 class Animal: def __init__(self,name): self.name=name def sleep(self): print(self.name,"在睡觉") def shout(self): print(self.name,"在大叫") #子类 class cat(Animal): def shout(self): print(self.name,"miaomiao") def eatfish(self): print(self.name,"在吃鱼") #子类2 class dog(Animal): def shout(self): print(self.name,"wangwang") #子类3 class monkey(Animal): def shout(self): print(self.name,"zhazha") #实例化 cc=cat("波斯猫") print("猫的名字",cc.name) cc.sleep() cc.shout() dd=dog("哈士奇") print("狗的名字",dd.name) dd.sleep() dd.shout() mm=monkey("金丝猴波斯猫") print("hou的名字",mm.name) mm.sleep() mm.shout()
结论:
如果在子类中使用了构造方法 那么在子类的构造方法中必须声明调用父类的构造方法 如果在子类中没有使用了构造方法 那么在子类会默认调用父类的构造方法
#父类 class Animal: def __init__(self,name): self.name=name def sleep(self): print(self.name,"在睡觉") def shout(self): print(self.name,"在大叫") #子类 class cat(Animal): #如果在子类中使用了构造方法 那么在子类的构造方法中必须声明调用父类的构造方法 # 如果在子类中没有使用了构造方法 那么在子类会默认调用父类的构造方法 def __init__(self,name,age): self.age=age super().__init__(name) def shout(self): print(self.name,"miaomiao") def eatfish(self): print(self.name,"在吃鱼") #子类2 class dog(Animal): def shout(self): print(self.name,"wangwang") #子类3 class monkey(Animal): def shout(self): print(self.name,"zhazha") #实例化 cc=cat("波斯猫",12) print("猫的名字",cc.name,"猫的年龄",cc.age) cc.sleep() cc.shout() dd=dog("哈士奇") print("狗的名字",dd.name) dd.sleep() dd.shout() mm=monkey("金丝猴波斯猫") print("hou的名字",mm.name) mm.sleep() mm.shout()