子类化时使用(滥用)super()

时间:2014-05-19 20:07:03

标签: python tkinter class-hierarchy

在努力学习tkinter FrameLabelFrame的子类以便他们坐在正确的父母身上时,我发现很多答案都表明super().__init__比{{1}更好当子类化时。

所以我试了一下,看看大惊小怪的事情,它似乎根本不起作用。在python 2.7中,它抱怨了参数的类型。在3.4中,它表示master有多个定义。超级评论如下,它按预期工作。我做错了什么?

BaseClass.__init()__

# import Tkinter as tki # py 2.7 import tkinter as tki # py 3.4 class App(tki.LabelFrame): def __init__(self, parent): tki.LabelFrame.__init__(self, master=parent, text='inner') # super().__init__(self, master=parent, text='inner') #py 3.4 # super(App, self).__init__(self, master=parent, text='inner') #py 2.7 # super(App, self).__init__(master=parent, text='inner') #py 2.7 self.quit = tki.Button(self, text='quit', command=exit) self.quit.grid() if __name__ == '__main__': root = tki.Tk() root.title('nesting testing') outer = tki.LabelFrame(root, text='outer level') outer.pack() app = App(outer) app.pack() root.mainloop() 的调用中删除self是我尝试过的第一件事,但在py2.7中,我仍然收到相同的错误消息,无论是否在那里。

没有super().__init__()

self

使用Traceback (most recent call last): File "C:\Python\TESTS\test_super.py", line 21, in <module> app = App(outer) File "C:\Python\TESTS\test_super.py", line 9, in __init__ super(App, self).__init__(master=parent, text='inner') #py 2.7 TypeError: must be type, not classobj

self

错误消息与我自我保持一致这一事实表明它不是问题,但它对BaseClass调用正常工作的事实令我困惑于其他参数可能出错的地方

2 个答案:

答案 0 :(得分:2)

如果我记得没错,那么

super().__init__(self, master=parent, text='inner')          #py 3.4
super(App, self).__init__(self, master=parent, text='inner') #py 2.7

应该是 -

super().__init__(master=parent, text='inner')          #py 3.4
super(App, self).__init__(master=parent, text='inner') #py 2.7

因为您不应将self作为参数传递给超级__init__

实际上,在使用实例方法时,不应将self显式传递给任何方法,当解释器调用时会自动提供self

BTW,

    tki.LabelFrame.__init__(self, master=parent, text='inner')
    super().__init__(self, master=parent, text='inner')          #py 3.4
    super(App, self).__init__(self, master=parent, text='inner') #py 2.7
    super(App, self).__init__(master=parent, text='inner') #py 2.7

所有这些电话都是多余的。你应该只使用其中一个。我更喜欢 -

    super().__init__(master=parent, text='inner')          #py 3.4

    super(App, self).__init__(master=parent, text='inner') #py 2.7

但如果您更喜欢使用第一个 -

    tki.LabelFrame.__init__(self, master=parent, text='inner')

确保删除自己并制作它 -

    tki.LabelFrame.__init__(master=parent, text='inner')

答案 1 :(得分:1)

以这种方式使用super时,您无法明确传递self。只需执行super(App, self).__init__(master=parent, text='inner')(或Python {3 {1}}。