繁体   English   中英

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

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

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

这是包含游戏逻辑的主要游戏模块。 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方法时,我收到类似的错误key_check 当所有代码都包含在同一脚本中时,它可以正常运行,而访问这些类实例没有问题。

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

如果您已将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)

暂无
暂无

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

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