Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python类:继承与实例化_Python_Class_Tkinter - Fatal编程技术网

Python类:继承与实例化

Python类:继承与实例化,python,class,tkinter,Python,Class,Tkinter,我正在创建一个使用Frame()作为基类的GUI类 在我的GUIclass的init方法中,我想创建一个框架小部件 现在我有: class GUIclass(Frame): def __init__(self, parent): frame = Frame(self, parent) 但我在第三行的其他地方看到了: Frame.__init__(self, parent) 我对编程、python和继承都是新手,我想知道我是否正确理解了两者之间的区别。我保证

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

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

现在我有:

class GUIclass(Frame):
    def __init__(self, parent):
        frame = Frame(self, parent)   
但我在第三行的其他地方看到了:

Frame.__init__(self, parent)   
我对编程、python和继承都是新手,我想知道我是否正确理解了两者之间的区别。我保证,我做了大量的研究和阅读,但我找不到任何东西可以完全清楚地说明这一点:

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

在第二个场景中,调用类上的init方法(我认为这是完全合法的?),因为没有创建框架对象,因此不会自动执行

是这样吗

我还看到:

frame = Frame.__init__(self, parent)   
这让我很反感。这只是某人在做一些多余的事情,还是有原因

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

您应该打电话给

super(GUIclass, self).__init__(parent)
这是调用(所有)继承的
\uuu init\uu()方法的正确方法。在许多情况下,它的结果与上述方法相同

Frame.__init__(self, parent)
frame = Frame(self.parent)
它只缺少关于继承关系的抽象,并将类
Frame
声明为唯一一个您可能要调用其
\uuuu init\uuuu()方法的类(稍后将详细介绍)

报告还提到

Frame.__init__(self, parent)
frame = Frame(self.parent)
在这方面是错误的。它属于另一种对象关系模式,即内容关系,而不是继承关系(您的目标)。它将创建一个类
Frame
的新对象,而不是初始化自己的
Frame
部分;在继承关系中,您是一个
框架
,因此您必须初始化
自己
,以及初始化您的专用部分(这在
\uuu init\uu()方法的其余部分中完成)。在内容关系模型中,您只有一个
框架

现在,我上面提到的调用
super(GUIclass,self).\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu

要理解这一点,您需要深入挖掘继承关系以及它们提供的各种可能性,特别是多重继承

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

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

在这个菱形模式中,您有另一个继承
GUIClass
类和另一个继承
Frame
SomeOtherClass


如果现在在
GUIclass
SomeOtherClass
中使用模式
Frame.\uuuuu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu(self,parent)
,那么从另一个类的
方法调用
Frame
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。这通常不是有意的,为了避免这种情况发生,发明了
super
调用。它注意一个合适的调用顺序只调用每个
\uu init\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu()
方法一次。

您必须使用
Frame.\uuuuuuuuuuu init uuuuuuuuuuuuuuuuuuuuuuu
第一个不正确,因为它在基于帧的对象的初始值设定项中创建了不必要的帧。第二个和第三个是对帧中父初始值设定项的超级调用,这样子类的初始值设定项将扩展基本值,而不是覆盖基本值。但是没有必要分配超级调用的结果,从而使第三个调用不正确。最好的解决方案是使用
super()。\uu init\uu(*参数)
(假设python3)在python2中,这将是
super(GUIclass,self)。\uu init\uu(*参数)
(假设是新样式的类)。此外,PEP8要求调用类
GUIClass
。不幸的是,Tkinter中不支持超级调用,
super
参数的顺序不同。谢谢,修复了这个问题。(我从来没有正确地回忆过这些,所以如果你恶作剧我,我只是不改进;-)啊,现在一切都有意义了,我想我看到了区别。所以我说第一个在技术上初始化了一个框架,但它创建了一个单独的框架对象,而不是说这个对象有这些框架属性,然后一些-然后一些是我的子类init中的任何其他属性,这是正确的吗?我还看到了在生成代码时的用途,当其他人出现时,代码不会崩溃,现在我独自一人在做,但我真的希望有一天成为一名程序员,所以这是我还没有想到的好建议。最好现在就开始练习!如果可以的话,我会加上10,第一个会创建一个单独的对象,并且不会初始化
self
的帧方面。Tkinter是否支持
super
:任何继承
对象的类都支持
super
机制。我不确定哪个Tkinter类是您的框架,但您可以查看一下
框架。\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果不是,请不要使用
super
机制,而是坚持使用
框架。