0804Python总结-单继承,多继承,菱形继承,__init__魔术方法(构造方法)

一.继承 -> 单继承

如果一个类继承另外一个类,
该类叫做子类(衍生类),被继承的类叫做父类(基类,超类)

继承:(1)单继承 (2)多继承
python中,所有的类都默认继承object
class Human(object):
	hair = "黑色"
	sex = "男"

	def cry(self):
		print("人类在伤心的时候,会流下鳄鱼的眼泪")

	def eat(self):
		print("人类在远古时候,捉到猎物直接吃")

	def __makebaby(self):
		print("人类在发育到成熟的时候,会造人")

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

class Man(Human):
	pass

obj =Man()
print(obj.hair)  # 黑色
obj.cry()  # 人类在伤心的时候,会流下鳄鱼的眼泪

2.子父继承之后,子类不能调用父类的私有成员

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

obj = Woman()
# obj.__makebaby()  error
# obj.pub_func()  error

3.子类继承之后,子类可以改写父类中的方法

子父继承之后
如果子类里面有该成员属性或者方法,优先调用自己的
如果没有该成员,调用父类中的成员
如果都没有,直接报错
class Children(Human):
	sex = "女性"
	def cry(self):
		print("小孩只会哇哇哇的哭")

obj = Children()
obj.cry()  # 小孩只会哇哇哇的哭
print(obj.__dict__)  # {}
print(Children.__dict__)  # {'__module__': '__main__', 'sex': '女性', 'cry': <function Children.cry at 0x000002C694025D90>, '__doc__': None}

二.多继承

1.基本语法

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)  # 风流倜傥,一表人才,一枝梨花压海棠
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 = "喜欢打游戏,wow,lol,dnf,泡泡堂,cf,dota,大话西游,跑跑卡丁车,吃鸡"

	# 1.利用类调用父类的成员
	def skill1(self):
		Father.f_hobby()
		print(Mother.property)

	# 2.利用对象调用父类的成员
	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().f_hobby()  error

obj = Son()
print("======")
obj.skill1()  # 社会摇,蹦迪,吃喝嫖赌,大保健   闭月羞花,倾国倾城,一枝红杏出墙来
print("======")
obj.skill2()  # 打麻将,打牌,喝酒抽烟烫头,跳广场舞    喜欢打游戏,wow,lol,dnf,泡泡堂,cf,dota,大话西游,跑跑卡丁车,吃鸡
print("======")
obj.skill3()  # 风流倜傥,一表人才,一枝梨花压海棠    打麻将,打牌,喝酒抽烟烫头,跳广场舞

self 和 super()的区别
self 在调用成员时,先看看自己的类对象中是否存在该成员,如果有调用自己的,如果没有,调用父类的,如果都没有报错
super() 在调用成员时,只调用父类的相关成员(属性,绑定方法),永远不会调用自己的,如果父类没有,直接报错

三.菱形继承(钻石继承)

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

class Human():
	pty = 4
	def feelT(self):
		print("原始人类如果热了,脱皮1")
		print(self.pty)
		print("原始人类如果冷了,扒别人的皮2")

class Man(Human):
	# pty = 3
	def feelT(self):
		print("现代男人如果热了,脱衣服,脱裤子3")
		super().feelT()
		print("现代男人如果冷了,脱别人的衣服,脱别人的裤子4")

class Woman(Human):
	# pty = 2
	def feelT(self):
		print("现代女人如果热了,吹空调,吃雪糕5")
		super().feelT()
		print("现代女人如果冷了,喝热水,用暖宝宝6")

class Children(Man, Woman):
	# pty = 1
	def feelT(self):
		print("现代小孩如果热了,就哭7")
		super().feelT()
		print("现代小孩如果冷了,也要哭8")

obj = Children()
obj.feelT()

73512648

# mro 列表: super用途的一个体现,解决复杂的多继承调用顺序关系
"""
类.mro() 返回的是方法调用顺序列表,针对于多继承下的同名方法,按照顺序依次的进行调用
"""
lst = Children.mro()
print(lst)
"""
[
<class '__main__.Children'>,
<class '__main__.Man'>,
<class '__main__.Woman'>,
<class '__main__.Human'>,
<class 'object'>
]
"""

issubclass 判断子父关系(应用在类当中,判断子父关系)
“”“只要在一条继承链上即可(有血缘关系)”""

res = issubclass(Children, Man)
print(res)  # True
res = issubclass(Children, Woman)
print(res)  # True
res = issubclass(Children, Human)
print(res)  # True
res = issubclass(Children, (Human, Woman, Man, OldWoman))
print(res)  # True
res = issubclass(Children, OldWoman)
print(res)  # False

isinstance(应用在对象和类之间,判断类型)
“”“只要在一条继承链上即可(有血缘关系)”""

res = isinstance(obj, Children)
print(res)  # True
res = isinstance(obj, Human)
print(res)  # True
res = isinstance(obj, (Human, Children, Woman))
print(res)  # True
res = isinstance(obj, OldWoman)
print(res)  # False

四.__init__魔术方法(构造方法)

"""
	触发时机:实例化对象,初始化的时候触发
	功能:为对象添加成员
	参数:参数不固定,至少一个self参数
	返回值:无
"""

1.基本语法

class MyClass():
	def __init__(self):
		print("初始化方法被触发")
		# 为当前对象self 添加成员 name
		self.name = "袁文志"

# 实例化对象
obj = MyClass()
print(obj.name)

2.带有多个参数的构造方法

class MyClass():
	def __init__(self, name):
		# self.成员名 = 参数
		self.name = name
# 实例化对象
obj = MyClass("宋云杰")  # 在实例化对象的时候,给构造方法传递参数
print(obj.name)

3.类可以是一个,对象可以是多个

“”“一个类可以实例化多个不同的对象,而对象和对象之间彼此独立,但都可以使用类中的公有的成员”""

class Children():
	def __init__(self, name, skin):
		self.name = name
		self.skin = skin

	def cry(self):
		print("小孩一出生就哇哇哇的哭")

	def drink(self):
		print("小孩一出生就要喝奶奶")

	def __la(self):
		print("小孩拉粑粑是私有的")

	def pub_info(self):
		print("该对象的名字是{},该对象的肤色是{}".format(self.name, self.skin))
# 创建第一个小孩
afanda = Children("阿凡达", "蓝色的")
afanda.pub_info()  # 该对象的名字是阿凡达,该对象的肤色是蓝色的
afanda.cry()  # 小孩一出生就哇哇哇的哭

# 创建第二个小孩
afanti = Children("阿凡提", "黄色的")
afanti.pub_info()  # 该对象的名字是阿凡提,该对象的肤色是黄色的
afanti.drink()  # 小孩一出生就要喝奶奶

# 创建第三个小孩
bao = Children("我滴宝强", "绿色的")
bao.pub_info()  # 该对象的名字是我滴宝强,该对象的肤色是绿色的
# bao.__la()  # 无法在类外调用私有的成员

猜你喜欢

转载自blog.csdn.net/qq_45957580/article/details/107827951