简体   繁体   English

Python 3:未定义名称“类实例”

[英]Python 3: Name 'Class instance' not defined

I've been working on a text-based adventure game and currently I'm working on splitting up one large game script I have into separate modules. 我一直在开发基于文本的冒险游戏,目前正在将一个大型游戏脚本拆分为单独的模块。

This is the main game module containing the game's logic. 这是包含游戏逻辑的主要游戏模块。 Within the main() function I have defined instances of classes 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()

Below is an excerpt from the gameworld module. 以下是gameworld模块的摘录。 It includes the functions that I'm having difficulty with. 它包括我遇到的困难的功能。 The Location.key_check and Bag.check_take functions. 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)

When I run the game, and attempt to pick up an item, I receive this traceback error: 当我运行游戏并尝试拾取物品时,我收到此回溯错误:

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

I receive a similar error when attempting to move to a locked room and the key_check method runs. 尝试移至上锁的房间并运行key_check方法时,我收到类似的错误key_check When the code is all contained in the same script, it runs fine with no problem accessing these class instances. 当所有代码都包含在同一脚本中时,它可以正常运行,而访问这些类实例没有问题。

You need to pass the location variable when you are calling bag.check_take as an argument as location is not defined and is not in scope inside the Bag class. 调用bag.check_take作为参数时,您需要传递location变量,因为location尚未定义并且不在Bag类的范围内。 You need to pass the variable represent other object when you call a class member function. 调用类成员函数时,需要传递代表其他对象的变量。

In the case that you've designed your Bag to have an inventory attribute which you update. 如果您已将Bag设计为具有要更新的库存属性。

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

Nitpick : move the mutation of the room inventory for a location to a manager function. Nitpick :将某个房间的房间库存的变异移动到经理功能。 See rest of answer below to get an idea. 请参阅下面的其余答案以了解一个想法。

You can make check_take into a function that take a key, bag and location. 您可以使check_take成为一个具有键,包和位置的函数。 This function can be imported and passed key, bag and location accordingly. 此功能可以导入并相应地传递密钥,包和位置。

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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM