一.面向对象-继承
继承:一个类除了自身所拥有的属性方法之外,还获取了另外一个类的成员属性和方法
子类:一个类继承另外一个类,也叫做衍生类
父类:被继承的类叫做父类,也叫做基类,超类
继承分为
1)单继承
2)多继承
python中所有的类都默认继承父类object
1.1单继承
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(构造方法的参数)
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()
1.2多继承
(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用法
super本身是一个类,super()是一个对象,用于调用父类的绑定方法
super()只应用在绑定方法中,默认自动传递self对象(前提:super所在作用域存在self)
super用途:解决复杂的多继承调用顺序
1.3菱形继承
super在菱形继承中调用子类上一层级所有的父类,都调用完了再找上一层级的父类调用,然后在依次返回调用结果
Human
Man Woman
Children
class BigMan():
pass
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()
打印结果
现代小朋友天热了,洗海澡7
现代男人天热了,吹吹空调3
现代女人天热了,洗洗澡5
原始人类天热了,让后裔把太阳射下来1
1
原始人类天冷了,让女娲补天,防止漏风2
现代男人天冷了,吃雪糕6
现代男人天冷了,吹暖气4
现代小朋友天冷了,钻被窝8
(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判断是否存在子父关系(语法使用与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)
(3) isinstance 判断类型
只要在一个继承链上即可(有血缘关系即可),是在判断对象和类之间的关系
res = isinstance(obj,Children)
res = isinstance(obj,Man)
res = isinstance(obj,Woman)
res = isinstance(obj,BigMan) # False
print(res)
__ dict __返回的是一个字典,类或者对象的所有成员
用 in 来判断成员在不在这个类或者对象中