单继承 多继承 菱形继承

本文详细解析Python中的继承机制,包括单继承、多继承的特性与应用场景,以及super函数的正确使用方法。同时,介绍了多态的概念,展示了如何通过继承改写实现不同子类对同一父类方法的不同响应。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

### 继承 : 一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法

"""
一个类继承另外一个类,那么该类就是子类(衍生类),被继承的这个类叫做父类	(基类,超类)
继承:
(1) 单继承 (2) 多继承

python所有的类都默认继承父类 object
"""

### 单继承

#如果子类想调用父类私有的,要先在父类里面定义一个公有的,然后在公有的里面先调出私有,最后就可以间接的调出私有,不能在子类中定义公有
class Human(object):
	hair = "金色"
	sex = "男"

	def eat(self):
		print("人类天生就喜欢吃吃吃")
	
	def la(self):
		print("人类天生就喜欢拉拉拉")
	
	def __makebaby(self):
		print("人类天生就能够繁衍后代")

(1) 子父继承之后,子类可以调用父类所有的公有成员

class Man(Human):  #class  Man(父类)
	pass

obj = Man() # Man(构造方法的参数,只能写init参数)★★★★★
print(obj.hair) # 金色

(2) 子父继承之后,子类不可以调用父类的私有成员

class Woman(Human):	
	def pub_makbaby(self):
		self.__makebaby()

obj = Woman()
obj.eat()
obj.__makebaby() 不行
obj.pub_makbaby()不行

(3) 子父继承之后,子类可以重写父类的同名方法

"""
子父继承之后
如果子类里面有该成员属性方法,优先调用自己的
如果没有该成员,那么调用父类的公有成员
如果都没有,直接报错;
"""
class Children(Human):
	sex = "女性"
	def eat(self):
		print("小孩下生只能吃奶奶~")

obj = Children()
print(obj.sex)
obj.eat()

### 多继承

#继承多个,调用的时候,按照继承的顺序去调用
#self是对象,可以调用属性和方法,在调用方法的时候要看有没有self,在调用时候要看自己有没有调用的成员
#子类继承多个父类,如果想调用父类的方法和属性,首先在子类中调用多个父类的方法和属性,用类调时:调用多个父类的方法(没有self)或者属性通过父的类去调用父类的属性和方法(没有self)到子类中,用self(对象)调,如果父类方法中有self,可以用self(对象)点上父类的方法到子类中,self(对象)可以调父类属性,在用self(对象)调父类属性时,首先看自己有没有,没有用父类的,然后再通过对象或者类调用子类就可以了(用对象调用,方法里面必须要有self)
#super在哪个类,返回的是哪个类的对象,
#super是对象,可以调用父类任何方法和属性(除了surper本类外),,顺序是从子类参数的左向右,在调用方法的时候,必须里面有self,不会调用自己本类公有成员,没有就报错

(1) 基本语法

class Father():
	property = "玉树临风,风流倜傥,一枝梨花压海棠"
	def f_hobby(self):
		print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")


class Mother():
	property = "沉鱼落雁,闭月羞花,一枝红杏出墙来"
	def m_hobby(self):
		print("打麻将,敷面膜,跳广场舞")
	
class Daughter(Mother,Father):	
	pass

实例化对象

obj = Daughter() 
print(obj.property)
obj.m_hobby()

(2) super用法

"""
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法
(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域	存在self)
(3)super用途: 解决复杂的多继承调用顺序	
"""
class Father():
	property = "玉树临风,风流倜傥,一枝梨花压海棠"
	def f_hobby():
		print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")


class Mother():
	property = "沉鱼落雁,闭月羞花,一枝红杏出墙来"
	def m_hobby(self):
		print("打麻将,敷面膜,跳广场舞")
	
class Son(Father,Mother):
	property = "打游戏,比如lol,wow,dnf,ddo,cs,cf,澄海3c,dota2"

	# 1.利用类来调用父类的成员
	def skill1(self):
		print(Mother.property)
		Father.f_hobby()
	
	# 2.利用对象调用父类的属性和方法
	"""self在调用父类成员的时候,如果本类里有,先调用自己的,没有,在调用父类的"""
	def skill2(self):
		self.m_hobby()
		print(self.property)
	
	# 3.利用super调用父类的属性和方法
	"""
		super()只调用父类的相关公有成员,不会调用自己本类中成员,父类也没有的话,直接报错.
		super() 特指只调用父类, 和 self不同.
	"""
	def skill3(self):
		print(super())
		print(super().property) # 玉树临风,风流倜傥,一枝梨花压海棠
		super().m_hobby()		
	
		# super()调用方法时,必须是绑定方法,默认传递该类的对象.
		# super().f_hobby()
	
obj = Son()	
obj.skill1()
obj.skill2()
print('<===>')
obj.skill3()

菱形继承

		 Human
Man      	 	  Woman
		Children
		


class Human():
	pty = 4
	def feelT(self):
		# self 此刻接受的是Children的对象
		print("原始人类天热了,让后裔把太阳射下来1")
		print(self.pty) #  obj.pty = 1
		print("原始人类天冷了,让女娲补天,防止漏风2")

class Man(Human):
	pty = 3
	def feelT(self):
		# self 此刻接受的是Children的对象
		print("现代男人天热了,吹吹空调3")
		super().feelT()
		print("现代男人天冷了,吹暖气4")
		
class Woman(Human):
	pty = 2
	def feelT(self):
		# # self 此刻接受的是Children的对象
		print("现代女人天热了,洗洗澡5")
		super().feelT()
		print("现代男人天冷了,吃雪糕6")

class Children(Man,Woman):
	pty = 1
	def feelT(self):
		print("现代小朋友天热了,洗海澡7")
		# super()调用方法时候,会携带者当前类的对象进行传递
		super().feelT()
		print("现代小朋友天冷了,钻被窝8")
	

obj = Children()
obj.feelT()

mro 列表 : super用途的体现,解决复杂的多继承调用顺序

类.mro() 返回的是方法调用顺序的列表,针对于多继承下的同名方法.按照列表的顺序依次调用.
lst = Children.mro()
print(lst)

issubclass 判断是否存在子父关系 (语法使用与isinstance的使用一模一样)

"""只要在一个继承链上即可(有血缘关系即可),应用范围在类的身上"""
res = issubclass(Children,Man)
res = issubclass(Children,Woman)
res = issubclass(Children,Human)
res = issubclass(Children,BigMan)
res = issubclass(Children , (Man,Woman,Human,BigMan))
print(res)

isinstance 判断类型

"""只要在一个继承链上即可(有血缘关系即可),是在判断对象和类之间的关系"""
res = isinstance(obj,Children)
res = isinstance(obj,Man)
res = isinstance(obj,Woman)
res = isinstance(obj,BigMan) # False
print(res)

print(Children.__dict__)

in 判断在或者不在 , 在=> True 不在=>False

res = "feelT" in Children.__dict__ 
print(res)

### 多态 : 不同的子类对象,调用相同的父类方法,产生了不同的执行结果

关键字:继承 改写
class Soldier():

	# 攻击
	def attack():
			pass

	# 撤退
	def back():
		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_airforce = AirForce()

 各部门注意,等待将军的命令
lst = [obj_army,obj_navy,obj_airforce]


1.全体出击
2.全体撤退
3.空军上,其他人撤
4.按q键退出



sign = True
while sign:
	num = input("将军请下令:")

	for i in lst:
		if num == "1":
			i.attack()
		elif num == "2":
			i.back()
		elif num == "3":	
			if isinstance(i,AirForce):
			i.attack()
			else:
				i.back()
		elif num.upper() == "Q":
			print("将军,您辛苦了~")
			sign = False
			break
		else:
			print("风太大,我听不见!")
			break
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值