这可能是一个基本的面向对象问题:
我正在尝试使用cmd创建嵌套控制台菜单,这个部分进行得很好。
我还希望所有子控制台都能访问相同的对象。但是这一部分没有进行得很好。
我的简单示例:
当我运行这个时,我得到的是:
请再试一次。
我的简单示例:
import cmd
class MainConsole(cmd.Cmd):
def __init__(self,obj1,obj2):
cmd.Cmd.__init__(self)
self.prompt = ">"
self.obj1 = obj1 # The objects I want access to in all my consoles.
self.obj2 = obj2
self.menu1 = SubConsole1() # I could pass in the objects here as arguments
self.menu2 = SubConsole2() # but there should be a better way.
def do_menu1(self,args):
self.menu1.cmdloop()
def do_menu2(self,args):
self.menu2.cmdloop()
def do_info(self,args):
self.menu1.do_info(args)
self.menu2.do_info(args)
def do_exit(self,args):
return -1
class SubConsole1(cmd.Cmd,MainConsole):
def __init__(self):
cmd.Cmd.__init__(self)
self.prompt = "1>"
def do_action(self,args):
print self.obj1.someattr1 # Doesn't work
class SubConsole2(cmd.Cmd,MainConsole):
def __init__(self):
cmd.Cmd.__init__(self)
self.prompt = "2>"
def do_action(self,args):
print obj1.someattr2 # Doesn't work
class anobject(object):
def __init__(self,init_value):
self.someattr1 = init_value
self.someattr2 = init_value * 2
object1 = anobject(1)
object2 = anobject(2)
c=MainConsole(object1,object2)
c.cmdloop()
当我运行这个时,我得到的是:
>
>menu1
1>info
AttributeError: SubConsole1 instance has no attribute 'obj1'
请再试一次。
>
>menu2
2>info
NameError: global name 'obj1' is not defined
我不确定SubConsoles是否应该是MainConsole的子类。我也尝试将SubConsoles嵌套在MainConsole内部。