加载中...

继承问题与isinstance和issubclass

继承

一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法 是一种继承关系
被继承的类叫做父类(基类,超类),继承的类叫做子类(衍生类)
在python中所有类都继承object这个父类
继承: (1) 单继承 (2) 多继承

单继承

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

class Human(object):
	eye = "黑色的"
	
	def jump(self):
		print("古代人类都能上树")
	
	def beat_animal(self):
		print("古代人类都会打猎")

	def __makefire(self):
		print("古代人类会生火")
        
        
class Man(Human):
	pass
	
obj = Man()
obj.jump()

子类无法继承父类的私有方法

class Human(object):
	eye = "黑色的"

	def jump(self):
		print("古代人类都能上树")

	def beat_animal(self):
		print("古代人类都会打猎")

	def __makefire(self):
		print("古代人类会生火")


class Woman(Human):
	def pub_func(self):
		print(self) # <__main__.Woman object at 0x000001E555E49520>
		# self.__makefire()  # self


# (3) 子父继承之后,子类可以重写父类的同名公有方法
class Children(Human):
	def beat_animal(self):
		print("小孩天生只会打豆豆,不会打猎")
		
obj3 = Children()
obj3.beat_animal()

子父继承之后,子类可以重写父类的同名公有方法

class Human(object):
	eye = "黑色的"

	def jump(self):
		print("古代人类都能上树")

	def beat_animal(self):
		print("古代人类都会打猎")

	def __makefire(self):
		print("古代人类会生火")
        
class Children(Human):
	def beat_animal(self):
		print("小孩天生只会打豆豆,不会打猎")
		
obj3 = Children()
obj3.beat_animal()

多继承

"""
	多继承寻找先继承的父类
"""

class Father():
	property = "风流倜傥,才华横溢,玉树临风,才高八斗,学富五车,英姿洒窗"
	def f_hobby(self):
		print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")
	
class Mother():
	property = "倾国倾城,貌美如花,沉鱼落雁,闭月羞花,婀娜多姿,前凸后翘"
	def m_hobby(self):
		print("蹦野迪,社会摇,打麻将,网红勾引小鲜肉")
		
class Daughter(Father,Mother):
	pass
	
obj = Daughter()
print(obj.property) # out "风流倜傥,才华横溢,玉树临风,才高八斗,学富五车,英姿洒窗"
obj.m_hobby()

解决跨越调用父类的方法 super

class Father():
	property = "风流倜傥,才华横溢,玉树临风,才高八斗,学富五车,英姿洒窗"

	def f_hobby(): # 最好不这么写 会红 但是能跑
		print("吃喝嫖赌抽,坑蒙拐骗偷,抽烟喝酒烫头")


class Mother():
	property = "倾国倾城,貌美如花,沉鱼落雁,闭月羞花,婀娜多姿,前凸后翘"

	def m_hobby(self):
		print("蹦野迪,社会摇,打麻将,网红勾引小鲜肉")


class Son(Father, Mother):
	property = "打游戏,吃小零食"

	def m_hobby(self):
		print("son中m_hobby方法")

	def skill1(self):  # 用类调用成员
		print(self)  # <__main__.Son object at 0x000001B2F3AE4DF0>
		Father.f_hobby()
		print(Mother.property)

	"""self按照顺序找: 对象本身 => 类 => 父类 对应的成员 """

	def skill2(self):
		print(self.property)  # 用对象调用成员
		self.m_hobby()  # 自动调用对象了

	"""super()只调用父类的相关成员,顺带传递对象参数"""

	def skill3(self):
		print(super()) # <super: <class 'Son'>, <Son object>>
		print(super().property)  # 用super调用成员
		super().m_hobby()


obj2 = Son()
obj2.skill1()  # 通过类调用成员函数或方法

obj2.property = "喜欢看lol,dnf,wow,跑跑卡丁车,ddo,霸王大陆,澄海3c"
obj2.skill2()  # """self按照顺序找: 对象本身 => 类 => 父类 对应的成员 """

obj2.skill3()  # 用super调用成员函数或方法

菱形继承

"""
	 Human
Man		    Woman
	Children
"""
class MyClass():
	pass

class Human():
	pty = 1
	def feelT(self):
		print("古代人类,天热了,光腚1")
		print(self.pty)
		print("古代人类,天冷了,穿寿衣2")
	
class Man(Human):
	# pty = 2
	def feelT(self):
		print("男人,天热了,光膀子3")
		print(super(),"<==2==>")
		super().feelT()
		print("男人,天冷了,光腚4")
	
class Woman(Human):
	# pty = 3
	def feelT(self):
		print("女人,天热了,脱毛5")
		print(super(),"<==3==>")
		super().feelT()
		print("女人,天冷了,穿貂6")

class Children(Man,Woman):
	# pty = 4
	def feelT(self):
		print("小孩,天热了,光腚7")
		print(super(),"<==1==>")
		super().feelT()
		print("小孩,天冷了,多喝热水8")
        
 # ### super的深层理解
obj = Children()
obj.feelT()
# 73512648

# self 一直都是 Chilren的 Obj 所以Pty会是 4 2 3 1 显示

mro方法与super

mro: 方法解析顺序 (c3算法计算的)m :method
r :resolution
o :order
super 会自动根据mro列表返回出来的顺序关系,依次调用
super作用:专门用于解决复杂的多继承调用顺序关系;依照mro返回的列表顺序,依次调用;
super调用的顺序:会按照c3算法的广度优先原则进行调用
super传参:会默认在调用方法时,传递该对象参数;

"""
	语法: 类.mro() => 列表
"""
lst = Children.mro()
print(lst)
"""
[
<class '__main__.Children'>, 
<class '__main__.Man'>, 
<class '__main__.Woman'>,
<class '__main__.Human'>, 
<class 'object'>
]
"""

issubclass与isinstance

issubclass

# issubclass 判断类的子父关系(应用在类与类之间)
# return bool
"""只要在一条继承链上满足关系即可"""
res = issubclass(Children,Man)
res = issubclass(Children,Human)
res = issubclass(Children,MyClass)
# 如果元组当中有一个父类满足,即返回真
res = issubclass(Children,  (Man,Human,MyClass)  )
print(res)

isinstance

# isinstance 判断对象的类型  (应用在类与对象之间)
# return bool
"""只要在一条继承链上满足关系即可"""
res = isinstance(obj,Children)
res = isinstance(obj,Human)
res = isinstance(obj,MyClass)
# 如果元组当中有一个类满足,即返回真
res = isinstance(obj,  (Man,Human,MyClass)  )
print(res)

from collections.abc import Iterable, Iterator

res = issubclass(Iterator, Iterable)
print(res)  # True  -> 迭代器的父类是 可迭代对象
res = issubclass(Iterable, Iterator)
print(res)  # False

posted @ 2024-03-15 00:46  江寒雨  阅读(26)  评论(0)    收藏  举报