簡體   English   中英

Python:創建一個類的許多實例

[英]Python: Creating many instances of a class

我有一個稱為Unit的類,它是游戲中的通用單元。 Unit一個實例可以是CavalryInfantry等,每個單位的坐標均指示其在網格上的初始位置。 我想創建這個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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM