栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

python继承中super().

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

python继承中super().

文章目录
  • 示例:xxxClass.init(self)继承
  • 示例:super().__init__()
  • 两者的区别

示例:xxxClass.init(self)继承
class BaseClass(object):
    def __init__(self):
        print("构造 BaseClass")


class MyClass1(BaseClass):
    def __init__(self):
        BaseClass.__init__(self)
        print("构造 MyClass1")


class MyClass2(BaseClass):
    def __init__(self):
        BaseClass.__init__(self)
        print("构造 MyClass2")


class SubClass(MyClass1, MyClass2):
    def __init__(self):
        print("子类构造 MyClass1:")
        MyClass1.__init__(self)
        print("子类构造 MyClass2:")
        MyClass2.__init__(self)


sub_class = SubClass()

效果:

子类构造 MyClass1:
构造 BaseClass
构造 MyClass1
子类构造 MyClass2:
构造 BaseClass
构造 MyClass2

可以看到子类会按部就班的依次继承,在构造MyClass1的时候

示例:super().init()
class BaseClass(object):
    def __init__(self):
        print("构造 BaseClass")


class MyClass1(BaseClass):
    def __init__(self):
        super().__init__()
        print("构造 MyClass1")


class MyClass2(BaseClass):
    def __init__(self):
        super().__init__()
        print("构造 MyClass2")


class SubClass(MyClass1, MyClass2):
    def __init__(self):
        print("子类构造 MyClass1:")
        super().__init__()
        print("子类构造 MyClass2:")
        super().__init__()


sub_class = SubClass()

效果:

子类构造 MyClass1:
构造 BaseClass
构造 MyClass2
构造 MyClass1
子类构造 MyClass2:
构造 BaseClass
构造 MyClass2
构造 MyClass1

可以看到:super().__init__()也是可以满足继承的,但是我们调试的时候会发现,运行顺序是:

  1. SubClass的__init()__
  2. MyClass1的__init()__
  3. MyClass2的__init()__
  4. BaseClass的print("构造 BaseClass")
  5. (看第3步)MyClass2的print("构造 MyClass2")
  6. (看第2步)MyClass1的print("构造 MyClass1")
  7. (看第1步)SubClass的后续操作:print("子类构造 MyClass2:")
两者的区别

所以两者都是会调用父类的方法,区别在于:

  • xxxClass.__init__(self)会调用一次父类的__init(self)__,可以把这个理解为执行了一次父类的__init__()函数
  • super().__init__()并不是在调用方法,而是按照继承顺序,执行下一个没有初始化的类。在第二个示例中,因为SubClass继承了两个类,一个是MyClass1,一个是MyClass2,所以这个方法会依次执行这两个类的__init()__

super().__init()不太好理解,见下一个示例:

class BaseClass(object):
    def __init__(self):
        print("构造 BaseClass")


class MyClass1(BaseClass):
    def __init__(self):
        super().__init__()
        print("构造 MyClass1")


class MyClass2(BaseClass):
    def __init__(self):
        super().__init__()
        print("构造 MyClass2")


class SubClass(MyClass1, MyClass2, BaseClass): # 这里,多继承了一个BaseClass
    def __init__(self):
        print("子类构造 MyClass1:")
        super().__init__()
        print("子类构造 MyClass2:")
        super().__init__()


sub_class = SubClass()

输出结果与第二个一样,虽然程序在SubClass那里多继承了一个,但是因为已经初始化了,所以就直接跳过了

在实际使用时,建议使用super().__init__(),可以防止多次调用同一个类的初始化

参考链接

  • What’s the difference between super() and Parent class name?:https://stackoverflow.com/questions/42413670/whats-the-difference-between-super-and-parent-class-name
  • Python 类继承,两种初始化(init)的区别:https://blog.csdn.net/houyanhua1/article/details/78182197
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/968727.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号