РЕДАКТИРОВАТЬ Хорошо, я неправильно понял, что вы делаете.
Вы правы, SubConsole1 и 2 не нужно наследовать от MainConsole.Но они должны иметь ссылку на главную консоль.
Что-то вроде:
class MainConsole(cmd.Cmd):
def __init__(self):
cmd.Cmd.__init__(self, obj1, obj2)
self.obj1 = obj2
self.obj2 = obj2
class SubConsole1(cmd.Cmd):
def __init__(self, maincon):
cmd.Cmd.__init__(self)
self.maincon = maincon
Затем вы можете получить доступ к нужным объектам, обратившись к self.maincon.obj1
и self.maincon.obj2
Другой вариант, и, возможно, лучший с точки зрения дизайна, состоит в том, чтобы вытащить все объекты, к которым вы хотите получить доступ, в объект контейнера Context и иметь все различные Cmd
объекты.сохранить собственную ссылку на этот контейнер контекста.
Примерно так:
import cmd
from collections import namedtuple
class MyConsole(cmd.Cmd):
def __init__(self, context):
cmd.Cmd.__init__(self)
self.context = context
class ConsoleContext(object):
def __init__(self, **kwargs):
self.__dict__ = kwargs
class MainConsole(MyConsole):
def __init__(self, context):
MyConsole.__init__(self, context)
self.menu1 = SubConsole1(context)
self.menu2 = SubConsole2(context)
self.prompt = '>'
def do_menu1(self, args):
self.menu1.cmdloop()
def do_menu2(self, args):
self.menu2.cmdloop()
def do_quit(self, args):
return True
class SubConsole1(MyConsole):
def __init__(self, context):
MyConsole.__init__(self, context)
self.prompt = '1>'
def do_action(self, args):
print self.context.message1
def do_quit(self, args):
return True
class SubConsole2(MyConsole):
def __init__(self, context):
MyConsole.__init__(self, context)
self.prompt = '2>'
def do_action(self, args):
print self.context.message2
def do_quit(self, args):
return True
if __name__ == '__main__':
context = ConsoleContext(message1='Message 1', message2='Message 2')
con = MainConsole(context)
con.cmdloop()
Надеюсь, я достаточно ясно.