python类的继承super_Python类的继承关系及super的用法

现实生活中也有继承的例子,比如子女继承父母的财产。

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的初始化来进行执行。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值