[英]Python: Creating many instances of a class
我有一個稱為Unit
的類,它是游戲中的通用單元。 該Unit
一個實例可以是Cavalry
, Infantry
等,每個單位的坐標均指示其在網格上的初始位置。 我想創建這個Unit
類的許多實例,以便填充地圖。
這是我所擁有的:
#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]
我正在嘗試用生成的類實例填充兩個列表。 然后遍歷這些列表以對其中的實例執行各種操作。 但是,每當我嘗試執行任何操作時,都會出現錯誤,指出List object has no attribute [attribute]
我很清楚我應該將單元的每個類別都做成一個從單元類繼承的類,我只是想知道這樣做是否絕對必要,為什么我的工作方式不起作用。
您的問題在這里:
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
如您所說,您應該真正考慮使用類。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.