gpt4 book ai didi

Python 类 : Inheritance vs Instantiation

转载 作者:太空狗 更新时间:2023-10-29 18:05:56 25 4
gpt4 key购买 nike

我正在创建一个使用 Frame() 作为其基类的 GUI 类。

在我的 GUI 类的 init 方法中,我想创建一个框架小部件

现在我有:

class GUIclass(Frame):
def __init__(self, parent):
frame = Frame(self, parent)

但我在其他地方看到了第三行:

Frame.__init__(self, parent)   

我是编程、python 和继承的新手,我想知道我是否正确理解了两者之间的区别。我做了很多研究和阅读,我保证,但我找不到任何可以完全清楚的东西:

在第一种情况下,我在创建一个框架对象 (frame) 时不调用 init 方法,当创建一个对象时,它的 init 方法由 python 隐式调用。

在第二种情况下,调用类的 init 方法(我认为这完全合法?)因为未创建 Frame 对象,因此不会自动执行。

是这样吗?

我还看过:

frame = Frame.__init__(self, parent)   

这真让我失望。这只是有人在做多余的事情还是有原因?

谢谢你的帮助,我现在想慢慢来,确保我完全理解我写的每一行代码,而不是编写和运行我一半理解的整个程序。

最佳答案

你应该打电话

super(GUIclass, self).__init__(parent)

这是调用(所有)继承的 __init__() 方法的正确方法。与提到的相比,它在许多情况下具有相同的结果

Frame.__init__(self, parent)

它只缺少有关继承关系的抽象,并将 Frame 类声明为唯一一个您可能想要调用其 __init__() 方法的类(更多关于稍后)。

还提到了

frame = Frame(self.parent)

在这种情况下是错误的。它属于另一种对象关系模式,即内容关系,而不是继承关系(你所针对的)。它将创建Frame的新对象,而不是初始化您自己的Frame部分;在继承关系中,你一个框架,所以你必须将你自己初始化为一个框架,同时初始化你的专用部分(这在__init__() 方法的其余部分)。在内容关系模型中,您只是一个框架

现在,我上面提到的调用 super(GUIclass, self).__init__(parent)Frame.__init__(self, parent)?

要了解您需要更深入地挖掘继承关系以及这些关系提供的各种可能性,尤其是多重继承。

考虑如下所示的菱形关系模型:

          Frame
/ \
GUIclass SomeOtherClass
\ /
AnotherClass

在您当前的场景中,您只有左上角的两个类,但永远不知道会发生什么,您应该始终以一种方式编码,以便您的代码的下一个用户保留所有选项。

在这个菱形模式中,您有 AnotherClass 继承了 GUIClassSomeOtherClass 又继承了 Frame.

如果您现在在 GUIclassSomeOtherClass 中都使用模式 Frame.__init__(self, parent),然后调用它们的 AnotherClass__init__() 方法中的 __init__() 方法将导致两次调用 Frame__init__() 方法。这通常不是有意为之,为了防止这种情况发生,发明了 super 调用。需要注意的是,适当的调用顺序仅调用每个 __init__() 方法且恰好一次。

关于Python 类 : Inheritance vs Instantiation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30269817/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com