我正试图用python弄清楚一些OOP的东西,我遇到了一些问题。我正在尝试制作一个“游戏”,让玩家在房间网格中走动,每个房间都是Room类的一个实例。如果我想制作一个大网格,实例化每个房间将是一个痛苦,因为我可能必须为64个不同的房间输入相同的重复坐标模式,所以我想创建一个能够为我做的功能,我'遇到问题,弄清楚如何。这是我的代码:
class Room(object):
def __init__(self, x, y):
self.x = x
self.y = y
def generate_rooms():
names = [a,b,c,d]
locations = [[1,1],[1,2],[2,1],[2,2]] #this line could be a few for loops
for x in range(0,4):
names[x] = Room(locations[x][0],locations[x][1])
这个想法是这将创建4个房间,名为a,b,c和d,其坐标指定位置。 Python不允许我这样做,因为没有定义a,b,c和d。在我尝试的任何实现中,我遇到了需要使用变量名完成命名实例的问题,我不知道如何动态生成它们。
我已经搜索了很多内容并不像实例化的自动化真的是人们想要做的事情,这让我感到困惑,因为在这样的情况下它似乎真的有意义。
非常感谢有关如何解决此问题或如何以更好的方式完成此任务的任何帮助!
答案 0 :(得分:4)
你非常接近!通常的方法是使用字典,并使用您想要的名称作为字典键。例如:
>>> class Room(object):
... def __init__(self, x, y):
... self.x = x
... self.y = y
...
>>> rooms = {}
>>> names = ['a', 'b', 'c', 'd']
>>> locations = [[1,1], [1,2], [2,1], [2,2]]
>>> for name, loc in zip(names, locations):
... rooms[name] = Room(*loc)
...
>>> rooms
{'a': <__main__.Room object at 0x8a0030c>, 'c': <__main__.Room object at 0x89b01cc>, 'b': <__main__.Room object at 0x89b074c>, 'd': <__main__.Room object at 0x89b02ec>}
>>> rooms['c']
<__main__.Room object at 0x89b01cc>
>>> rooms['c'].x
2
>>> rooms['c'].y
1
通过这种方式,您可以通过多种方式迭代房间,例如:
>>> for roomname, room in rooms.items():
... print roomname, room.x, room.y
...
a 1 1
c 2 1
b 1 2
d 2 2
答案 1 :(得分:1)
一些想法:
也许在Room-class中有一个名字字段是有意义的吗?
a = Room(1,1)有什么问题?您可以稍后在数组中存储。即在您实例化房间后声明数组。
你为什么要关心命名? Python并不关心。
自动实例化很简单,通常使用循环和数组完成。编写修改/创建程序的程序称为元编程,并且不是微不足道的。
祝你好运!答案 2 :(得分:0)
下面只是稍作修改:
class Room(object):
def __init__(self, x, y):
self.x = x
self.y = y
def generate_rooms():
names = [a,b,c,d] // <-- this line goes crazy, since a,b,c,d is not defined yet
locations = [[1,1],[1,2],[2,1],[2,2]]
for x in range(0,4): // <-- this part can be improved
names[x] = Room(locations[x][0],locations[x][1])
// no return here? then what to generate?
def new_generate_rooms():
locations = [[1,1],[1,2],[2,1],[2,2]]
rooms = [Room(loc[0], loc[1]) for loc in locations]
return rooms
def main():
rooms = new_generate_rooms()
for i,room in enumerate(rooms):
print str(i)+'-th room: ', room.x, room.y
我觉得您可能需要了解更多pythonic语法和习语。保佑。