Python:创建 class 的多个实例

Python: Creating many instances of a class

我有一个名为 Unit 的 class,它是游戏中的通用单位。 Unit 的实例可以是 CavalryInfantry 等,每个单元都有坐标表示其在网格上的初始位置。我想创建此 Unit class 的许多实例以填充地图。

这是我的:

#create units for team 1
#(self, name, x, y, char, color, move_range, atk_range, unit_size, morale, power, fatigue, team)

team_1_cavalry =[(Unit('Cavalry', i+20, 10, 'A', libtcod.yellow, 6, 1, 1000, 100, 1.5, 500, 1)) for i in range(11) ]
team_1_infantry = [(Unit('Heavy Infantry', i+20, 9, '=', libtcod.yellow, 3, 1, 2000, 100, 1.0, 200, 1)) for i in range(11)]
team_1_elephants = [(Unit('War Elephants', 20, 8, 'R', libtcod.yellow, 5, 1, 37, 100, 100, 800, 1)) for i in range(2)]

#create units for team 2
team_2_cavalry = [(Unit('Cavalry', 20+i, 15, 'A', libtcod.green, 6, 1, 500, 1000, 1.5, 500, 2)) for i in range (5)]
team_2_infantry = [(Unit('Roman Infantry', 20+i, 16, '=', libtcod.green, 3, 1, 2000, 100, 1.0, 200, 2)) for i in range(20)]

#the list of objects with those two
team1 = []
team2 = []
for unit in team_1_cavalry, team_1_infantry, team_1_elephants:
    team1.append(unit)
for unit in team_2_cavalry, team_2_infantry:
    team2.append(unit)

teams = [team1, team2]

我想做的是用 class 的生成实例填充两个列表。然后遍历这些列表以对其中的实例执行各种操作。但是,每当我尝试做任何事情时,我都会收到一条错误消息 List object has no attribute [attribute]

我很清楚我应该将每个类别的单元变成一个继承自单元 class 的 class,我只是想知道这是否绝对有必要完成这项工作并且为什么我这样做的方式不起作用。

你的问题在这里:

for unit in team_1_cavalry, team_1_infantry, team_1_elephants:

这是对元组 team_1_cavalry, team_1_infantry, team_1_elephants 的迭代。所以,首先 unit 是整个列表 team_1_cavalry,然后是整个列表 team_1_infantry,然后是整个列表 team_1_elephants.

您想要的是以下其中一项:

for unit_group in team_1_cavalry, team_1_infantry, team_1_elephants:
    for unit in unit_group:

for unit in team_1_cavalry + team_1_infantry + team_1_elephants:

for unit in itertools.chain(team_1_cavalry, team_1_infantry, team_1_elephants)

第二个可能是最简单的——只要您知道您正在创建一个不必要的大临时列表,并且该列表将始终足够小以至于不会对性能产生影响。


但是,如果您实际上根本不需要这三个单独的列表,为什么还要创建它们呢?如果你这样做可能会更简单:

team_1 = [(Unit('Cavalry', i+20, 10, 'A', libtcod.yellow, 6, 1, 1000, 100, 1.5, 500, 1)) for i in range(11) ]
team_1 += [(Unit('Heavy Infantry', i+20, 9, '=', libtcod.yellow, 3, 1, 2000, 100, 1.0, 200, 1)) for i in range(11)]
team_1 += [(Unit('War Elephants', 20, 8, 'R', libtcod.yellow, 5, 1, 37, 100, 100, 800, 1)) for i in range(2)]

现在,team_1 就是团队 1 的所有三种单位。

在:

teams = [team1, team2]

您正在构建列表的列表(team1 和 team2 是列表)。

如果您想创建 2 个列表中的一个:

teams = team1 + team2

正如你所说,你真的应该考虑使用 类。