python - 如何从某个类动态实例化对象
问题描述
我正在使用 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() 来完成,但有人告诉我要避免使用该功能。
解决方案
动态生成变量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]})')
推荐阅读
- time-complexity - 这段代码的时间复杂度是多少?
- javascript - Websocket 与 Apollo Express、Nginx 和 docker-compose
- powershell - 如何从 powershell 启动一个进程而不把它带到前面?
- loops - 循环内的 Ansible 循环
- c# - 内存数据库中的 EF Core 未保存 ICollection 对象列
- c# - 使用 C# 和 MongoDB 的多态性
- c++ - 在抛出“std::logic_error”实例后,什么可以使 ROS 包终止调用?
- android - Intent Activity Utils ,未在 Manifest 中声明 - Kotlin, Android
- node.js - Node.js 中的关注点分离
- vimeo - 访问令牌没有编辑范围错误