2014-02-07 4 views
0

, пожалуйста, помогите исправить сценарий.Как реализовать множественное наследование?

import tkinter 
import sys 


class mainMenu(tkinter.Frame): 

    def __init__(self, parent): 
     tkinter.Frame.__init__(self, parent) 
     self.pack(side = 'top', fill = 'x') 
     self.parent = parent 
     self.make_menu_bar() 

    def make_menu_bar(self): 
     menubar = tkinter.Menu(self.parent) 
     self.parent.config(menu = menubar)       

     file = tkinter.Menu(menubar, tearoff = False) 
     file.add_command(label = 'Quit', command = sys.exit()) 
     menubar.add_cascade(label = 'File', menu = file) 


class MainFrame(tkinter.Frame, mainMenu): 

    def __init__(self, parent): 
     tkinter.Frame.__init__(self, parent) 
     self.pack(side = 'top', fill = 'x', expand = 'yes') 
     self.parent = parent 
     self.make_elements() 

    def make_elements(): 
     self.menu = TextPadMenu.__init__(self, parent) 


root = MainFrame(tkinter.Tk()) 
root.mainloop() 

проблема заключается в том, что класс MainFrame не может наследовать от: tkinter.Frame, MainMenu. сообщение об ошибке:

Traceback (most recent call last): File "C:\Python33\projects\TEXTPADS\textPad_OOP\q.py", line 22, in class MainFrame(tkinter.Frame, mainMenu): TypeError: Cannot create a consistent method resolution order (MRO) for bases Frame, mainMenu

+5

Почему вы хотите 'MainFrame' наследовать от рамки и MainMenu? mainMenu уже наследует от Frame, поэтому нет необходимости наследовать от Frame снова. – BrenBarn

+0

Этот простой пример исследования, он не имеет практической ценности. для меня важно понять принцип – Sergey

+2

Принцип заключается в том, чтобы не создавать класс, который наследуется от одного и того же класса несколько раз. Если класс B наследуется от A, тогда не делайте класс C, который явно наследует от A и B. Просто наследуйте его от B, и это автоматически также сделает его наследованием от A. – BrenBarn

ответ

1

Это не проблема tkinter, это просто, как классы работают на python. Короткий ответ на ваш вопрос: вы не можете делать то, что хотите. Можно взломать обходной путь, но почему? Вы никогда не должны наследовать как из класса, так и из базового класса этого класса.

Чтобы проиллюстрировать тот факт, что это не программа Tkinter, вот минимальное решение, которое дает ту же ошибку:

class Base(object): pass 
class Example1(Base): pass 
class Example2(Base, Example1): pass 

При запуске, это дает следующий результат:

bash-3.2$ python example.py 
Traceback (most recent call last): 
    File "example.py", line 3, in <module> 
    class Example2(Base, Example1): pass 
TypeError: Error when calling the metaclass bases 
    Cannot create a consistent method resolution 
order (MRO) for bases Example1, Base 

Понимание метода порядок разрешения может быть затруднен, когда вы выходите из пределов нормального использования. Если вы хотите более глубокий ответ на вопрос «почему я не могу это сделать?», Начало здесь:

http://www.python.org/download/releases/2.3/mro/

Смежные вопросы