定义MAIN_MENU函数从其他方法在Python类中调用

问题描述 投票:0回答:1

我有几个方法的类来分配来自用户的输入,将添加,删除或更新与输入嵌套的字典属性,三种方法。我想补充一个MAIN_MENU功能,使用户可以访问的添加,删除和更新方法,然后选择要么继续添加/删除/更新字典,或返回到主菜单。

当我试图做一个MAIN_MENU功能,我收到NameError:名字“命令”是没有定义。该计划将通过预期如果MAIN_MENU不是一个函数,但一旦我试图把它变成一个功能,我得到的错误循环。我已经尝试了不同级别的缩进,但我是新来的Python和不知道什么尝试。

class MyClass:
    def __init__(self):
        self.x = 0
        self.y = 0
        self.z = 0

    def get_x(self):
        #code to get x from user input
    def get_y(self):
        #code to get y from user
    def get_z(self):
        #code to get z from user

    def add_info(self):
        store_info = {}
        id = 0
        while command = '1':
            new_info = {}
            new_id = len(store_info) + 1
            store_info[new_id] = new_info

            x = h.get_x()
            new_info['x'] = x
            y = h.get_y()
            new_info['y'] = y
            z = h.get_z()
            new_info['z'] = z

            print('Your info has been updated.\n', store_info)
            choice = input('To add more info, type 1. To return to the main menu, type 2')
            if choice == '1':
                continue
            elif choice == '2':
                 main_menu()
            else:
                print('The End')
                break

    def delete_info(self):
        #code to delete, with an option at the end to return to main_menu

    def update_info(self):
        #code to update, with option for main_menu

def main_menu():
    main_menu_option = """Type 1 to add.
Type 2 to delete.
Type 3 to update.
Type any other key to quit.\n"""

    h = MyClass()
    command = input(main_menu_option)
    if command == '1':
        h.add_info()
    elif command == '2':
        h.delete_info()
    elif command == '3':
        h.update_info()
    else:
        print('Good bye.')

main_menu()

当我运行该程序,我得到的主菜单和类型1,但随后收到命令NameError。之前,我试图让MAIN_MENU一个功能,我可以访问Add方法添加信息,以嵌套的字典。

python-3.x function class
1个回答
0
投票

在Python方法/函数只能访问变量在其范围或父作用域。例如:

command = 1  # A

def foo():
    print(command)

def bar():
    command = 2  # B
    print(command)

foo()
bar()
print(command)

打印出1然后2然后1。这工作,因为当我们调用foo,蟒蛇着眼于局部变量,实现没有command变量存在,所以它看起来在上述范围内,看到在标签A的command变量然后当我们调用bar()我们添加了一个变量,名为command(标签二)bar的局部变量,然后打印,请注意,Python没有看这里的全局变量,所以它打印2不改变初始command变量(标签A)我们可以看到,当我们终于print(command)在脚本结束。

正是因为这样,你的计划失败,你add_info方法试图访问一个名为command但是,没有在其本地变量或全球范围存在变量。造成这种情况的解决将是通过将其作为参数传递给来自command的方法add_info添加到main_menu局部变量。

# in main_menu
if command == '1':
    h.add_info(command)

# in add_info
def add_info(self, command):
    ...
© www.soinside.com 2019 - 2024. All rights reserved.