首页 > 解决方案 > 如何从某个类动态实例化对象

问题描述

我正在使用 2D 地图制作一个简单的球类游戏。地图上的球数量是可变的。开始游戏时,我加载地图并寻找球(球是唯一的字母)。我将这些球名附加到一个列表中。我也有一个球类。__init__ 包含球的坐标,该类包含几个方法。

问题来了:我想使用 Ball 类创建每个球的对象,对象名称对应于属于球的字母。

我试过这个:(
地图是一个 txt 文件,如下所示:)
0 0 0 0
0 0 X 0
0 A 0 B
其中零代表空图块。

class Ball:
    def __init__( self, x, y):
        self.x = x
        self.y = y

map_data = np.genfromtxt('map.txt', dtype=str)
ball_names = []

for row in variables.map_data:
    for i in row:
        if i.isalpha():
           ball_names.append(i)   
for ball in ball_names:
    coordinates = np.where(map_data == ball)
    ball = Ball(coordinates[0], coordinates[1])
    

但是我希望该对象以变量ball包含的字符串命名,而不是“ball”。我知道这可以使用 exec() 来完成,但有人告诉我要避免使用该功能。

标签: pythonoop

解决方案


动态生成变量exec是一个坏主意。事实上,变量将完全对开发人员隐藏。支持这样的代码将是一场噩梦,它将成为问题的巨大根源。

相反,你为什么不创建一个球的字典?

my_balls = dict()
for ball in ball_names:
    coordinates = np.where(map_data == ball)
    my_balls[ball] = Ball(coordinates[0], coordinates[1])

但是如果你真的想创建一个变量,那么:

exec(f'{ball} = Ball({coordinates[0]}, {coordinates[1]})')

推荐阅读