你能在Python中创建一个类的多个实例吗?

2024-04-25 01:32:07 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在尝试用python解决一些面向对象的问题,但遇到了一些问题。我试图制作一个“游戏”,让玩家在一个房间网格中走动,每个房间都是房间类的一个实例。如果我想做一个大的网格,实例化每个房间将是一件痛苦的事,因为我可能需要为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没有定义。在我尝试过的任何实现中,我都遇到了这样一个问题:命名实例需要使用变量名,而我不知道如何动态生成这些实例。你知道吗

我已经搜索了很多,但似乎实例化的自动化并不是人们真正想做的事情,这让我很困惑,因为在这样的情况下它似乎真的很有意义。你知道吗

任何关于如何解决这个问题或如何更好地完成这个任务的帮助都是非常感谢的!你知道吗


Tags: 实例函数self网格游戏密码fornames
3条回答

只是下面的小改动:

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语法和习语。上帝保佑。你知道吗

一些想法:

也许在Room类中有一个name字段是有意义的?你知道吗

a=房间(1,1)有什么问题?稍后可以将存储在数组中。即在实例化房间后声明数组。你知道吗

你为什么关心命名呢?Python不在乎。你知道吗

自动安装非常简单,通常是通过循环和数组来完成的。编写修改/创建程序的程序被称为元编程,而不是琐碎的。你知道吗

祝你好运!你知道吗

你很接近!通常的方法是使用字典,并使用您想要的名称作为字典键。例如:

>>> 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

相关问题 更多 >