[英]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_check
和Bag.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.