1. 单继承 / 多继承 / 菱形继承
# ### 继承 : 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 """ 一个类可以继承另外一个类,那么当前类是子类(衍生类),被继承的类是父类(基类,超类) python中继承的种类: (1) 单继承 (2) 多继承 object 是所有类的父类 """ # (1) 基本语法 class Human(): hair = "黑色" __age = 18 def eat(self): print("远古人类天生吃猎物,烤着吃") def sleep(self): print("远古人类睡觉的时候打呼噜") def __makebaby(self): print("远古人类,一天能造出3个孩子") # (1) 子父继承之后 , 子类可以调用父类的公有成员 class Man(Human): pass obj = Man() print(obj.hair) obj.eat() # (2) 子父继承之后 , 子类不可以调用父类的私有成员 class Woman(Human): def myfunc(self): print(self.hair) # 无法调用父类私有成员 # print(self.__age) obj = Woman() obj.myfunc() # (3) 子父继承之后 , 子类可以改写父类公有成员 """ 子父继承之后,如果子类含有该成员,先优先调用自己的, 如果子类中不含有该成员,调用父类的, 父类如果也没有,直接报错 """ class Children(Human): def eat(self): print("儿童下生都喝奶奶") obj = Children() obj.eat()
# ### 多继承 : 一个子类有多个父类 # (1) 基本语法 class Father(): f_property = "玉树临风,花见花开,一枝梨花压海棠" def f_hobby(self): print("抽烟喝酒烫头,坑蒙拐骗偷") class Mother(): m_property = "俏皮可爱,沉鱼落雁,一直红杏出墙来" def m_hobby(self): print("打麻将,做头发,修电脑,买包包") class Daughter(Father , Mother): pass obj = Daughter() print(obj.f_property) obj.m_hobby() # (2) super的使用 """ (1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法 (2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self) (3)super用途: 解决复杂的多继承调用顺序 """ print("<=================>") class Father(): f_property = "玉树临风,花见花开,一枝梨花压海棠" def f_hobby(): print("抽烟喝酒烫头,坑蒙拐骗偷") class Mother(): m_property = "俏皮可爱,沉鱼落雁,一直红杏出墙来" def m_hobby(self): print("打麻将,做头发,修电脑,买包包") # 子类调用父类方法 class Son(Father,Mother): f_property = "头发是自来卷,说话是英国味,老婆说是胎教学的" m_property = "皮肤颜色是黑色的,黑种人,跟老爸长得不像" # 1.利用类的方式调用成员属性和方法 def skill1(self): print(Father.f_property) Father.f_hobby() # 2.利用self调用父类的成员属性和方法 def skill2(self): print(self.m_property) self.m_hobby() # 3.利用super电泳父类的成员属性和方法 def skill3(self): print(super().f_property) super().m_hobby() # super() 只能调用绑定方法,默认传递self参数; # super().f_hobby() error obj = Son() # obj.skill1() # obj.skill2() obj.skill3() """ self 与 super 的区别 self 在调用父类成员时,如果自己本类含有该成员,调用自己的,否则调用父类的 super 永远只调用父类成员,不调用自己本类的 """
# ### 菱形继承 (钻石继承) """ Human Man Woman Children """ class Human(): pty = 1 def feelT(self): print("远古人类,天热了,退毛1") """ super调用方法时,会默认携带self对象进行传递 从children 一直传递到最上层 Human 通过self调用pty属性 得到4 """ print(self.pty) print("远古人类,天冷了,涨毛2") class Man(Human): pty = 2 def feelT(self): print("现代人类,天热了,喝啤酒,开空调,吃烤串3") super().feelT() print("现代人类,洗热水脚,剃光头,喝白酒4") class Woman(Human): pty = 3 def feelT(self): print("女人天热了,脱光光,吹空调,扇扇子,喝热水5") super().feelT() print("女人天冷了,喝热水,穿貂皮,上火炕6") class Children(Man,Woman): pty = 4 def feelT(self): print("小孩天热了,打游戏,吃冰管,敲代码7") super().feelT() print("小孩天冷了,穿棉袄,用暖宝宝放衣服里8") obj = Children() obj.feelT() """ mro列表:方法调用顺序列表 语法: 类.mro() 使用C3算法计算,返回一个列表 super() 就是按照这个列表的顺序,依次进行调用 """ lst = Children.mro() print(lst) """ [ <class '__main__.Children'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Human'>, <class 'object'> ] 73512648 """ # super 就是用来解决多继承,复杂的调用关系(成员名字相同的情况下)
2. 类的多态
# ### 多态 :不同的子类对象,调用相同的父类方法,产生不同的执行结果 """ 关键字: 继承 , 重写 特点 : 在不改变原有代码的前提下,而实现不同效果 , 多态针对的是对象 对象不同,调用相同的方法,实现了不同的效果,是多态. """ """ # issubclass 判断是否是子父关系 res = issubclass(Army,ceshi) print(res) # isinstance 判断对象是否是该类型 [在一条继承链上即可] res = isinstance(obj_army,ceshi) print(res) """ class ceshi(): pass class Soldier(): def attack(self): pass def back(self): pass # 陆军 class Army(Soldier): def attack(self): print("[陆军]你砍我 , 我砍你,一刀999级") def back(self): print("[陆军]撒腿就跑,畏罪潜逃") # 海军 class Navy(Soldier): def attack(self): print("[海军]扔鱼叉,插死一个算一个") def back(self): print("[海军]跳海喂鱼,畏罪潜逃") # 空军 class AirForce(Soldier): def attack(self): print("[空军]拿出二营长的意大利炮,射击") def back(self): print("[空军]直接跳伞,落地成盒") # 创建陆军士兵 obj_army = Army() # 创建海军士兵 obj_navy = Navy() # 创建空军士兵 obj_air = AirForce() # 各就位准备 listvar = [obj_army,obj_navy,obj_air] # 将军请下令 strvar = """ (1) 全体出击 (2) 全体撤退 (3) 空军上,其他人迅速撤离 """ sign = True while sign: # 打印显示的内容 print(strvar) num = input("将军,请下令") # 按钮只有1,2,3 是字符串 if num in ["1","2","3"]: # 强转成数字 num = int(num) # 循环列表 for i in listvar: if num == 1: i.attack() elif num == 2: i.back() elif num == 3: # 判断该对象是AirForce创建的 if isinstance(i,AirForce): i.attack() else: i.back() # 如果字符串是q,则退出整个程序 elif num.upper() == "Q": print("风太大了,我听不到~") sign = False break
day18