Python 子类调用父类的同名方法和属性, super()函数

本文讲述了Python中如何在子类中调用父类的同名方法和属性,强调了初始化顺序的重要性,并介绍了使用super()函数进行方法调用的方法,以及单继承中的__mro__顺序。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

子类调用父类的同名方法和属性: 把父类的同名属性和方法再次封装

注意:

  1. 定义同名方法前需要再次调用初始化自己所属属性 __init__(self)
  2. 父系方法的语法:父系类名.同名方法(self)
class AAA:  # AAA父类
    def __init__(self):
        self.kongfu = ('AAA古法')

    def make_cake(self):
        print(f'老师傅使用 {self.kongfu}')


class BBB:  # BBB父类
    def __init__(self):
        self.kongfu = ('BBB现在工艺')

    def make_cake(self):
        print(f'学校使用 {self.kongfu}')


# 子类,继承AAA和BBB父类,并且有同名方法
class PPP(BBB, AAA):
    def __init__(self):
        self.kongfu = '个性化创意'

    def make_cake(self):  # 与父类同名方法
        # 当要调用子类方法时,这里必须先调用初始化自己的__init__属性,否则属性是上次结果属性
        PPP.__init__(self)  # 也可以写成 self.__init__()
        print(f'自己使用 {self.kongfu}')

    def AAA_make_cake(self):  # 调用 父类 的同名方法, 父类名.父类同名方法名(self)
        # 再次调用初始化的原因:
        # 这里想要调用父类的同名方法和属性。属性在init初始化位置,所以需要再次调用init
        AAA.__init__(self)  # 一定要加(self)形参,否则报错
        AAA.make_cake(self)     # 父类名.父类的同名实例方法

    def BBB_make_cake(self):  # 调用 父类 的同名方法, 父类名.父类同名方法名(self)
        # 再次调用初始化的原因:
        # 这里想要调用父类的同名方法和属性。属性在init初始化位置,所以需要再次调用init
        BBB.__init__(self)  # 一定要加(self)形参,否则报错
        BBB.make_cake(self)     # 父类名.父类的同名实例方法


s1 = PPP()
s1.AAA_make_cake()  # 执行 AAA 父类同名方法
s1.make_cake()  # 执行 PPP 子类同名方法
s1.BBB_make_cake()  # 执行 BBB 父类同名方法

 执行结果:

使用super() 函数:用于调用父类的一个方法。根据__mro__顺序调用上一级, 比较适合单继承。

语法:

 super(当前类名,self).方法实例()            有参数写法

 super().方法实例()                                 无参数写法

class Master:
    def __init__(self):
        self.kongfu = '古法技术'

    def make_cake(self):
        print(f'使用 {self.kongfu}')


class School(Master):
    def __init__(self):
        self.kongfu = '现代技术'

    def make_cake(self):
        print(f'使用 {self.kongfu}')
        # 加入super()带参数写法   super(当前类名,self).实例方法()
        super(School, self).__init__()    # 继承School的父类(Master类)
        super(School, self).make_cake()


class Stu(School):
    def __init__(self):
        self.kongfu = '独创技术'

    def make_cake(self):
        self.__init__()
        print(f'使用 {self.kongfu}')

    def old1_make_cake(self):
        # 无参数super    super().方法实例() 自动查找当前父类
        super().__init__()  # 继承当前Stu的父类 School
        super().make_cake()


print(Stu.__mro__)  # stu 继承 School, School 继承 Master, Master是顶层。
tony = Stu()
tony.old1_make_cake()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值