Python 3:名称'类实例'未定义

时间:2017-08-25 16:25:14

标签: python class module instance nameerror

我一直致力于基于文本的冒险游戏,目前我正在努力将一个大型游戏脚本拆分为单独的模块。

这是包含游戏逻辑的主要游戏模块。在main()函数中,我定义了类的实例

from gameworld import *


def main():

    player = Player("Jeff", 100)
    bag = Bag([])
    location = Location('introd')

    command = '  '
    while command != "":
        command = input('>>> ')
        if command in location.room.exits:
            location.travel(command)
        elif command == 'look':
            location.room_desc()
        elif command == '':
            print('You have to say what it is you want to do!')
            command = '#'
        elif command == 'search':
            location.search_room()
        elif command.split()[0] == 'Take':
            bag.check_take(command.split()[1])
        elif command == 'Inventory':
            bag.check_inv()
        else:
            print('Invalid command')


if __name__ == '__main__':
    main()

以下是gameworld模块的摘录。它包括我遇到困难的功能。 Location.key_checkBag.check_take函数。

#gameworld.py

class Room:

    def __init__(self, name, description, exits, actions, roominv, roomkey, lock):
        self.name = name
        self.description = description
        self.exits = exits
        self.actions = actions
        self.roominv = roominv
        self.roomkey = roomkey
        self.lock = lock

class Location:

    def __init__(self, room):
        self.room = world[room]

    def key_check(self, new_room_name):
        if world[new_room_name].lock and world[new_room_name].roomkey not in bag.inventory:
            self.no_key()
        else:
            world[new_room_name].lock = False
            self.set_room(new_room_name)
            self.room_desc()
class Bag():

    def __init__(self, inventory):
        self.inventory = inventory

    def add_to_inv(self, key):
        self.inventory.append(location.room.roominv[key])
        del location.room.roominv[key]

    def none_here(self, key):
        print("You can't find a", key)

    def check_take(self, key):
        if location.room.roominv and key in location.room.roominv:
            self.add_to_inv(key)
            print('you take the', key)
        else:
            self.none_here(key)

当我运行游戏并尝试拿起一个项目时,我收到此追溯错误:

Traceback (most recent call last):
  File "C:\Users\Daniel\Python 3.6\Scripts\PythonPR\PythonPR\FlubbosModuleTest.py", line 31, in <module>
    main()
  File "C:\Users\Daniel\Python 3.6\Scripts\PythonPR\PythonPR\FlubbosModuleTest.py", line 23, in main
    bag.check_take(command.split()[1])
  File "C:\Users\Daniel\Python 3.6\Scripts\PythonPR\PythonPR\gameworld.py", line 81, in check_take
    if location.room.roominv and key in location.room.roominv:
NameError: name 'location' is not defined

尝试移动到锁定的房间并且key_check方法运行时,我收到类似的错误。当代码全部包含在同一个脚本中时,它运行正常,访问这些类实例没有问题。

2 个答案:

答案 0 :(得分:2)

当您调用bag.check_take作为参数时,您需要传递位置变量,因为未定义位置且不在Bag类的范围内。在调用类成员函数时,需要传递变量表示其他对象。

答案 1 :(得分:1)

如果您将Bag设计为具有您更新的广告资源属性。

def add_to_inv(self, key):
   self.inventory.append(location.room.roominv[key])
   del location.room.roominv[key]

Nitpick :将位置的房间库存变异移动到经理功能。请参阅下面的其余部分以获得一个想法。

您可以将check_take变成一个带钥匙,包和位置的功能。此功能可以导入并相应地传递密钥,包和位置。

def check_take(key, bag, location=None):
    if location.room.roominv and key in location.room.roominv:
        bag.add_to_inv(key)
    else:
        bag.none_here(key)