当前位置: 首页 > 知识库问答 >
问题:

python - 请帮忙看一下如下代码 object对象init会初始化多少次?

姜烨伟
2024-09-17
class Person(object):
    def __init__(self,aaa):
        self.aaa = aaa

class Father(Person):
    def __init__(self, name,aaa):
        Person.__init__(self,aaa)
        self.name = name

class Mother(Person):
    def __init__(self, aaa,age):
        Person.__init__(self, aaa)
        self.age = age

class Son(Father, Mother):
    def __init__(self, gender, name, age,aaa):
        Father.__init__(self, name,aaa)
        Mother.__init__(self, aaa,age)
        self.gender = gender

son = Son('male', 'John', 25,"ccc")


我看了黑马视频 那家伙说如果如果所有类继承了object 那么会执行无数次

我觉得一次都不会执行,因为子类继承了父类,如果子类没重写init方法那么会继承父类的 所以会执行父类init方法,但是代码中子类重写了init 方法,不会自动执行父类的了,一次都不会,除非父类名.__init__()显式调用,不知道对不对

共有1个答案

湛联
2024-09-17

答案:在这个例子中,Person 类的 __init__ 方法会被调用两次。

解释

在 Python 中,当你创建一个类的实例时,如果该类定义了 __init__ 方法,那么这个方法会在实例被创建时自动调用。在你的代码中,Son 类继承自 FatherMother,并且 FatherMother 都继承自 Person。重要的是要注意,尽管 Son 类没有直接继承自 Person,但它通过多重继承间接地继承了 Person

Son 类的 __init__ 方法中,你显式地调用了 FatherMother__init__ 方法。由于 FatherMother 都调用了 Person__init__ 方法(通过 Person.__init__(self, aaa)),因此 Person__init__ 方法会被调用两次:一次是通过 Father__init__ 方法,另一次是通过 Mother__init__ 方法。

你提到的“如果子类没重写init方法那么会继承父类的init方法”是正确的,但在这种情况下,子类确实重写了 __init__ 方法,并在其内部通过显式调用父类的 __init__ 方法来确保父类的初始化逻辑被执行。

因此,Person 类的 __init__ 方法在这个例子中会被调用两次。如果你不想这样,你可能需要重新考虑你的类设计和继承结构,或者通过其他方式(如使用组合而非继承)来避免这种情况。

 类似资料:
  • 本文向大家介绍java对象初始化代码详解,包括了java对象初始化代码详解的使用技巧和注意事项,需要的朋友参考一下 本文主要记录JAVA中对象的初始化过程,包括实例变量的初始化和类变量的初始化以及final关键字对初始化的影响。另外,还讨论了由于继承原因,探讨了引用变量的编译时类型和运行时类型 一,实例变量的初始化 这里首先介绍下创建对象的过程: 类型为Dog的一个对象首次创建时,或者Dog类的s

  • 问题内容: 当涉及到String时,对于对象的情况我有点困惑,因此想知道以下代码将创建多少个对象,并针对String池和堆对String对象的创建进行了一些解释。 问题答案: 将创建4个对象。 两个注意事项: 总是创建一个新对象。字符串文字只能为所有情况创建一个对象。最佳实践是永远不要使用-实例化是多余的。 两个字符串的连接转换为,因此在此处创建了另一个对象。

  • windows操作系统下无法在一个php文件里初始化多个Worker, 例如下面test.php <?php ... $socket_server = new Worker("tcp://0.0.0.0:5555"); $socket_server->on.... $websocket_server = new Worker("websocket://0.0.0.0:6666"); $websoc

  • 系统初始化(init) [KNL] init=文件全路径 指定内核挂载根文件系统后运行的第一个用户空间程序的绝对路径。默认为"/sbin/init"。 [KNL] rdinit=全路径 设置从initramfs中运行的第一个用户空间程序的绝对路径,默认为"/init"。 [注意]一旦使用了initramfs并且成功的运行了其中的"/init",所有"init"以及与根文件系统相关的选项(包括"nf

  • 没有安装 San-CLI 需要安装 npm i -g san-cli 快速创建 san init <app-name> 创建的是 san 项目。 app-name 是要创建的工程项目目录,可以为.(即在当前目录下创建)。 指定脚手架创建 san init <template> <app-name> template 是工程项目脚手架地址,支持 github、icode、gitlab 等 re