现实生活中也有继承的例子,比如子女继承父母的财产。
Python中类的继承也就是一个类继承另一个类的话,便可以拥有所继承类的所有属性和方法,此时使用起来不仅方便且节省代码量。
首先聊一聊Python类中self的理解:
Python类里面的self表示的是实例本身 ,比如我们创建了一个对象。 对象自动传递到类中创建的函数中,此时函数就可以执行这个函数了。
一、不使用super的继承
1 Python单继承
class Goat(object):
def __init__(self):
self.name = "乔丹"
print(f"{self.name}将篮球推向了全世界")
def god(self):
print(f"{self.name}是历史上最伟大的篮球运动员,篮球之神")
class My_favor(Goat):
pass
M = My_favor()
M.god()
>>> 乔丹将篮球推向了全世界
乔丹是历史上最伟大的篮球运动员,篮球之神
分析: My_favor继承了goat这个类,所以就拥有goat类的所有属性和方法。
2 Python多继承
class Goat(object):
def __init__(self):
self.name = "乔丹"
print(f"{self.name}将篮球推向了全世界")
def god(self):
print(f"{self.name}是历史上最伟大的篮球运动员,篮球之神")
class Mamba(object):
def __init__(self):
self.name = "科比"
print(f"{self.name}最具职业精神的伟大篮球运动员")
def god(self):
print(f"{self.name}是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我")
# class My_favor(Goat,Mamba):
class My_favor(Mamba,Goat):
pass
M = My_favor()
M.god()
>>> 科比最具职业精神的伟大篮球运动员
科比是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我
分析:如果一个类继承多个父类的时候,优先继承的是第一个类的属性和方法,也即若想优先继承哪个类,就把哪个类放在最前面即可。
class Goat(object):
def __init__(self):
self.name = "乔丹"
print(f"{self.name}将篮球推向了全世界")
def god(self):
print(f"{self.name}是历史上最伟大的篮球运动员,篮球之神")
class Mamba(object):
def __init__(self):
self.name = "科比"
print(f"{self.name}最具职业精神的伟大篮球运动员")
def god(self):
print(f"{self.name}是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我")
# class My_favor(Goat,Mamba):
class king_james(Mamba,Goat):
def __init__(self):
self.name = "詹姆斯"
print(f"{self.name}最全能的伟大的篮球运动员")
def god(self):
print(f"{self.name}是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员")
M = king_james()
M.god()
>>> 詹姆斯最全能的伟大的篮球运动员
詹姆斯是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员
分析:如果子类和父类拥有同名属性和方法,子类创建对象调用属性和方法的时候,调用到的是子类里面的同名属性和方法。
print(king_james.__mro__)
>>> (, , , )
分析:当代码比较复杂时,可通过__mro__方法来查看具体某个类的继承关系。
class Goat(object):
def __init__(self):
self.name = "乔丹"
print(f"{self.name}将篮球推向了全世界")
def god(self):
print(f"{self.name}是历史上最伟大的篮球运动员,篮球之神")
class Mamba(object):
def __init__(self):
self.name = "科比"
print(f"{self.name}最具职业精神的伟大篮球运动员")
def god(self):
print(f"{self.name}是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我")
# class My_favor(Goat,Mamba):
class king_james(Mamba,Goat):
def __init__(self):
self.name = "詹姆斯"
# print(f"{self.name}最全能的伟大的篮球运动员")
def god(self):
print(f"{self.name}是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员")
def god_goat(self):
Goat.__init__(self)
Goat.god(self)
def god_mamba(self):
Mamba.__init__(self)
Mamba.god(self)
#print(king_james.__mro__)
M = king_james()
M.god_mamba()
>>> 科比最具职业精神的伟大篮球运动员
科比是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我
分析:如果在子类中想调用父类的同名属性和方法,则需要在子类中重新定义函数(再次封装),且进行初始化。
3 多层继承
class Goat(object):
def __init__(self):
self.name = "乔丹"
print(f"{self.name}将篮球推向了全世界")
def god(self):
print(f"{self.name}是历史上最伟大的篮球运动员,篮球之神")
class Mamba(object):
def __init__(self):
self.name = "科比"
print(f"{self.name}最具职业精神的伟大篮球运动员")
def god(self):
print(f"{self.name}是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我")
# class My_favor(Goat,Mamba):
class king_james(Mamba,Goat):
def __init__(self):
self.name = "詹姆斯"
print(f"{self.name}最全能的伟大的篮球运动员")
def god(self):
print(f"{self.name}是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员")
def god_goat(self):
Goat.__init__(self)
Goat.god(self)
def god_mamba(self):
Mamba.__init__(self)
Mamba.god(self)
class fat_tiger(king_james):
pass
# print(king_james.__mro__)
fat = fat_tiger()
fat.god()
fat.god_goat()
fat.god_mamba()
>>> 詹姆斯最全能的伟大的篮球运动员
詹姆斯是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员
乔丹将篮球推向了全世界
乔丹是历史上最伟大的篮球运动员,篮球之神
科比最具职业精神的伟大篮球运动员
科比是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我
分析:如上所示,多层继承也完全可以实现调用父类函数及属性。
二、使用super的继承
上述方法在继承父类的属性和方法时,若父类的类名修改的话,子类在继承的时候也要相应的进行修改,同时代码量大,复杂。接下里介绍super方法继承。
1 无参数的super使用
1.1 继承一个类
class Goat(object):
def __init__(self):
self.name = "乔丹"
print(f"{self.name}将篮球推向了全世界")
def god(self):
print(f"{self.name}是历史上最伟大的篮球运动员,篮球之神")
class Mamba(object):
def __init__(self):
self.name = "科比"
print(f"{self.name}最具职业精神的伟大篮球运动员")
def god_mamba(self):
print(f"{self.name}是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我")
# class My_favor(Goat,Mamba):
class king_james(Mamba):
def __init__(self):
self.name = "詹姆斯"
print(f"{self.name}最全能的伟大的篮球运动员")
def god(self):
print(f"{self.name}是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员")
super().__init__()
super().god_mamba()
# print(king_james.__mro__)
M = king_james()
M.god()
>>> 詹姆斯最全能的伟大的篮球运动员
詹姆斯是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员
科比最具职业精神的伟大篮球运动员
科比是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我
分析:使用super来继承Mamba这个类。
1.2 继承多个类
class Goat(object):
def __init__(self):
self.name = "乔丹"
print(f"{self.name}将篮球推向了全世界")
def god_goat(self):
print(f"{self.name}是历史上最伟大的篮球运动员,篮球之神")
class Mamba(Goat):
def __init__(self):
self.name = "科比"
print(f"{self.name}最具职业精神的伟大篮球运动员")
super().__init__()
super().god_goat()
def god_mamba(self):
print(f"{self.name}是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我")
# class My_favor(Goat,Mamba):
class king_james(Mamba):
def __init__(self):
self.name = "詹姆斯"
print(f"{self.name}最全能的伟大的篮球运动员")
def god(self):
print(f"{self.name}是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员")
super().__init__()
super().god_mamba()
# print(king_james.__mro__)
M = king_james()
M.god()
>>> 詹姆斯最全能的伟大的篮球运动员
詹姆斯是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员
科比最具职业精神的伟大篮球运动员
乔丹将篮球推向了全世界
乔丹是历史上最伟大的篮球运动员,篮球之神
乔丹是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我
分析:同时调用多级类。
1.3 定义私有属性和方法
class Goat(object):
def __init__(self):
self.__name = "乔丹"
print(f"{self.name}将篮球推向了全世界")
def god_goat(self):
print(f"{self.name}是历史上最伟大的篮球运动员,篮球之神")
class Mamba(Goat):
def __init__(self):
self.name = "科比"
print(f"{self.name}最具职业精神的伟大篮球运动员")
super().__init__()
super().god_goat()
def god_mamba(self):
print(f"{self.name}是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我")
# class My_favor(Goat,Mamba):
class king_james(Mamba):
def __init__(self):
self.name = "詹姆斯"
print(f"{self.name}最全能的伟大的篮球运动员")
def god(self):
print(f"{self.name}是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员")
super().__init__()
super().god_mamba()
# print(king_james.__mro__)
M = king_james()
M.god()
>>> 詹姆斯最全能的伟大的篮球运动员
詹姆斯是历史上唯一一个为三个城市带来总冠军且获得FMVP的球员
科比最具职业精神的伟大篮球运动员
科比将篮球推向了全世界
科比是历史上最伟大的篮球运动员,篮球之神
科比是我最喜欢的篮球运动员,他的曼巴精神深深鼓励了我
分析:设置私有属性或者函数,在属性或者函数钱加”__“即可。由于上面中self.__name = "乔丹",设置了私有属性,所以只能用Mamba的初始化来进行执行。