gpt4 book ai didi

python - 对象继承和嵌套 cmd

转载 作者:行者123 更新时间:2023-11-28 20:28:21 25 4
gpt4 key购买 nike

这可能是一个基本的 OO 问题:我正在尝试使用 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 中。

最佳答案

编辑 好吧,我误解了你在做什么。

没错,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.obj1self.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()

希望我说得足够清楚。

关于python - 对象继承和嵌套 cmd,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5822164/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com