1.继承
继承 : 一个类除了拥有自身的属性方法之外,还拥有另外一个类的属性和方法
继承: 1.单继承 2.多继承
子类:一个类继承了另外一个类,那么这个类是子类,(衍生类)
父类:一个类继承了另外一个类,被继承的那个类是父类 (超类,基类)
object 是所有的类的父类
例:
class Human():
def eat(self):
print("远古人类打猎,吃猎物")
def sleep(self):
print("远古人类吃饱了就睡觉")
def __beat_doudou(self):
print("远古人类起来先打豆豆,在打猎")
# 把要继承的类放到class 定义类的这个括号里面写
1.1(1) 子类可以调用父类的公有成员(方法,属性)
class Man(Human):
pass
# 实例化对象
obj = Man()
obj.eat()
运行结果:
1.2(2) 子类不可以调用父类私有成员(方法,属性)
class Woman(Human):
def myskill(self):
# 调用父类公有方法
self.eat()
# 不能够在子类里面调用父类私有方法
# self.__beat_doudou()
obj = Woman()
# obj.__beat_doudou() 私有的没法再类外调用
obj.myskill()
代码执行结果:
1.3(3) 子类可以改造父类的公有方法
子父继承之后,如果调用的成员,
子类里面有,优先调用子类的
子类里面没有,就调用父类
class Children(Human):
# 对eat方法进行改写
def eat(self):
print("小孩下生只会喝奶奶")
obj = Children()
obj.eat()
运行结果:
2.多继承
2.1基本用法
#(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.2调用父类
注意点:
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
(3)super用途: 解决复杂的多继承调用顺序
例:
扫描二维码关注公众号,回复:
6264998 查看本文章
class Father(): f_property = "风流倜傥,英俊潇洒" def f_hobby(): print("吃喝嫖赌抽,坑蒙拐骗偷,喜欢烫头") class Mother(): m_property = "沉鱼落雁,闭月羞花" def m_hobby(self): print("打麻将,跳广场舞,喜欢买名牌包包")
class Son(Father,Mother): # f_property = "子类的属性f_property" # (1)通过类的方式调用父类的相关成员 def skill1(self): # 调用Father中的f_hobby Father.f_hobby() # 调用Mother中的m_property print(Mother.m_property) # (2)通过对象的方式调用父类的相关成员 def skill2(self): # 调用Father中的f_property print(self.f_property) # 调用Mother中的m_hobby self.m_hobby() # (3)使用super调用父类的相关成员 def skill3(self): # 调用Father中的f_property # super() 一定调用的是父类的,区别于self. # print(super().f_property) #风流倜傥 # super().f_hobby() error super()调用的是绑定方法,默认传递self参数 # 调用Mother中的m_hobby super().m_hobby() print("<====>") obj = Son() # obj.skill1() #吃喝嫖赌抽,坑蒙拐骗偷,喜欢烫头 沉鱼落雁,闭月羞花''
# obj.skill2() obj.skill3() ''' self 在子类存在这个成员的时候,调用自己的 子类不存在这个成员的时候,调用父类的 而super,是一定只调用父类的公有成员属性,和公有绑定方法. '''
运行结果:
3.菱形继承
Human
Man Woman
Children
class Human(): pty = 111 def feelT(self): print("远古人类天热了,脱毛1") print(self.pty) print("远古人类天冷了,长毛2") class Man(Human): pty = 222 def feelT(self): print("现代男性天热了,开空调3") super().feelT() print("现代男性天冷了,也开空调4") class Woman(Human): pty = 333 def feelT(self): print("现代女性天热了,穿比基尼5") super().feelT() print("现代女性天冷了,也穿比基尼,要风度,不要温度6") class Children(Man,Woman): pty = 444 def feelT(self): print("小孩天热了,他就吃冰棍哭7") super().feelT() print("小孩天冷了,他就吃奶奶哭8") obj = Children() obj.feelT()
运行结果为:
注意:上面这种继承方式即是广度优先,在python开始的版本的时候是采用的深度优先调用。
# mro列表 :通过c3算法,把所有的继承关系按照列表的顺序呈现. # 语法: 类.mro() => 继承顺序列表 [ <class '__main__.Children'>, <class '__main__.Man'>, <class '__main__.Woman'>, <class '__main__.Human'>, <class 'object'> ] super 就是默认按照mro列表的顺序,依次调用 用于解决多继承调用顺序混乱的问题 ''' lst = Children.mro() print(lst)
# 判断是否是子父关系 [有血缘关系即可] issubclass res = issubclass(Children,Man) print(res) res = issubclass(Children,Human) print(res) # 满足一个条件,即返回真 res = issubclass(Children,(Man,Woman)) print(res) # 判断对象的类型 [有血缘关系即可] isinstance res = isinstance(obj,Children) print(res) res = isinstance(obj,Man) print(res) res = isinstance(obj,(Human,Woman)) print(res)
运行结果:
4. 多态
不同的子类对象,调用相同的父类方法,产生不同的执行结果 特征: 继承 重写 好处: 在不改变代码的前提下,实现代码的复用,和不同的效果.
例:
# 陆军 class Army(Soldier): def attack(self): print("[陆军]开坦克以迅雷不及掩耳之势占领敌方的高地") 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_airforce = Airforce() lst = [obj_army,obj_navy,obj_airforce] # 等待将军下达命令
# 按照下面的执行命令就行编写程序:
##思路 思路 思路 strvar = """ 你好将军,下面是您的操作按钮; 1.全体攻击 2.全体撤退 3.陆军出击,其他人撤退 4.退出程序 """ sign = True while sign: print(strvar) num = input("将军请下令:") for i in lst: if num == "1": i.attack() elif num == "2": i.back() elif num == "3": if isinstance(i,Army): i.attack() else: i.back() elif num.upper() == "Q": sign = False break else: print("风太大,我听不到") break
注:如果在循环里面套有循环的话,想退出内层循环的时候,即是退出外层循环
注意使用中间变量sign