2017-01-21 40 views
1

在下面的代码:困惑__init__方法中的高清__init__

import tkinter as tk 

    class CardShuffling(tk.Tk): 
     background_colour = '#D3D3D3' 
     deck_size = 52 

     def __init__(self): 
      tk.Tk.__init__(self) # What does this do? 

我感到困惑的最后一行的目的.. CardShuffling的实例,从tk.Tk继承,没有最后一行刚请重复已由CardShuffling(tk.Tk)处理过的内容?

回答

4

CardShuffling(tk.Tk)只使CardShufflingtk.Tk的孩子。你的新类继承了这个类的所有方法。

但是,如果你创建一个新的对象,你仍然需要调用该基类的构造函数(以新对象作为参数)。想象在父类的构造函数中有一行self.a = 0。您的子类必须在初始化新实例时运行此行; CardShuffling(tk.Tk)不能为你做;您需要运行父类的__init__

通常的方式做到这一点在Python 3

def __init__(self): 
    super().__init__() 

这是在这种情况下

def __init__(self): 
    tk.Tk.__init__(self) 

也许这article on inheritance有助于相同,甚至还有免费提供一个book chapter

+0

我已阅读文章,但仍有点困惑。 CardShuffling是tk.Tk的孩子,因此它拥有tk.Tk的所有方法 - 但是我们仍然需要在子类的构造函数中明确声明它?你能否充实'self.a = 0'的评论?为什么CardShuffling(tk.Tk)从父构造函数中运行该行,如果它继承了父构造函数的所有内容...... – dimebucker91

+0

因为在定义类时,“self”不存在。当你声明:'cs = CardShuffling()'时,你只会得到一个实例(有'self'的实例)。现在'cs'是一个实例。只有现在,你可以附加一个像'self.a'这样的成员(然后转换成'cs.a')到那个实例。 –