8.05_python_lx_day23
一.继承 -> 单继承
如果一个类继承另外一个类,该类叫做子类(衍生类),被继承的类叫做父类(基类,超类)
继承: (1) 单继承 (2) 多继承
python中,所有的类都默认继承父类object
class Human(object):
hair = "黑色"
sex = "男"
def cry(self):
print("人类在伤心的时候,会留下鳄鱼的眼泪")
def eat(self):
print("人类在远古时候,抓到猎物直接吃")
def __makebaby(self):
print("人类在发育到成熟的时候,会造人")
(1) 子父继承之后,子类可以调用父类的公有成员
1 class Man(Human):#Man是Human的子类
2 pass
3 obj = Man()
4 print(obj.hair)
5 obj.cry()
(2) 子父继承之后,子类不能调用父类的私有成员
1 class Woman(Human):#Woman是Human的子类
2 def pub_func(self):
3 self.__makebaby()
4 obj = Woman()
5 # obj.__makebaby() error
6 # obj.pub_func() error
(3) 子父继承之后,子类可以改写父类中的方法
- 子父继承之后
- 如果子类里面有该成员属性或者方法,优先调用自己的
- 如果没有该成员,调用父类中的成员
- 如果都没有,直接报错
1 class Children(Human):
2 sex = "女性"
3 def cry(self):
4 print("小孩只会哇哇哇的哭")
5 obj = Children()
6 obj.cry()
7 print(obj.__dict__)
8 print(Children.__dict__)
二.多继承
(1) 基本语法
class Father():
property = "风流倜傥,一表人才,一枝梨花压海棠"
def f_hobby(self):
print("社会摇,蹦迪,吃喝嫖赌,大保健")
class Mother():
property = "闭月羞花,倾国倾城,一枝红杏出墙来"
def m_hobby(self):
print("打麻将,打牌,喝酒抽烟烫头,跳广场舞")
class Daughter(Father,Mother):
pass
实例化对象
1 obj = Daughter()
2 print(obj.property)
3 obj.m_hobby()
(2) super用法
- super本身是一个类 super()是一个对象 用于调用父类的绑定方法
- super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)
- 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>利用类来调用父类的成员
1 def skill1(self):
2 Father.f_hobby()
3 print(Mother.property)
<2>利用对象调用父类的成员
1 def skill2(self):
2 self.m_hobby()
3 print(self.property)
<3>利用super调用父类的属性和方法
1 def skill3(self):
2 # print(super())
3 print(super().property)
4 super().m_hobby()
5 # super().f_hobby() error
- super()只调用父类的相关公有成员,不会调用自己的本类成员,父类没有直接报错.
- super()在调用父类方法时,只调用父类的绑定方法,默认传递参数是本类的对象self
(3)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()
(1)mro 列表 : super用途的一个体现.解决复杂的多继承调用顺序关系
- 类.mro() 返回的是方法调用顺序列表,针对于多继承下的同名方法,按照顺序依次的进行调用
lst = Children.mro()
print(lst)
- [
- <class '__main__.Children'>,
- <class '__main__.Man'>,
- <class '__main__.Woman'>,
- <class '__main__.Human'>,
- <class 'object'>
- ]
(2)issubclass 判断子父关系 (应用在类当中,判断子父关系)
- 只要在一条继承链上即可(有血缘关系)
1 res = issubclass(Children,Man)
2 print(res)
3 res = issubclass(Children,Woman)
4 print(res)
5 res = issubclass(Children,Human)
6 print(res)
7 res = issubclass(Children,(Human,Woman,Man,OldWoman))
8 print(res)
9 res = issubclass(Children,OldWoman)
10 print(res)
(3)isinstance (应用在对象和类之间,判断类型)
- 只要在一条继承链上即可(有血缘关系)
1 res = isinstance(obj,Children)
2 print(res)
3 res = isinstance(obj,Human)
4 print(res)
5 res = isinstance(obj,(Human,Children,Woman))
6 print(res)
7 res = isinstance(obj,OldWoman)
8 print(res)
四.魔术方法 (特定时机,自动触发)
(1)__init__魔术方法(构造方法)
- 触发时机:实例化对象,初始化的时候触发
- 功能:为对象添加成员
- 参数:参数不固定,至少一个self参数
- 返回值:无
<1>基本语法
1 class MyClass():
2 def __init__(self):
3 print("初始化方法被触发")
4 # 为当前对象self 添加成员 name
5 self.name = "abc"
6 # 实例化对象
7 obj = MyClass()
8 print(obj.name)
<2>带有多个参数的构造方法
1 class MyClass():
2 def __init__(self,name):
3 # self.成员名 = 参数
4 self.name = name
5 # 实例化对象
6 obj = MyClass("123") # 在实例化对象时候,给构造方法传递参数
7 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))
①创建第一个小孩
1 afanda = Children("阿凡达","蓝色的")
2 afanda.pub_info()
3 afanda.cry()
②创建第二个小孩
1 afanti = Children("阿凡提","黄色的")
2 afanti.pub_info()
3 afanti.drink()
③创建第三个小孩
1 bao = Children("我滴宝强","绿色的")
2 bao.pub_info()
3 bao.__la() # 无法在类外调用私有的成员
(1)super本身是一个类 super()是一个对象 用于调用父类的绑定方法(2)super() 只应用在绑定方法中,默认自动传递self对象 (前提:super所在作用域存在self)(3)super用途: 解决复杂的多继承调用顺序