2017-03-02 15 views
1

我正在使用Python3。在運行時將類實例放入列表中

  1. 我創建了一個名爲Players()的類,其中包含9個屬性。作爲一個例子,其中一個屬性是Player.name
  2. 然後我創建了9個名爲p1,p1 .... p9的類的實例。
  3. 在運行期間,用戶被要求挑選球員並將他們放在名爲「陣容」的列表中。這是我使用的代碼:我打印屏幕上的列表

    for i in range(0,9): 
         name = input("Enter player....")  #user picks an instance of the Player class 
         lineup.append(name)     #this loops 9 times so all the instances are picked and placed in the lineup list 
    

4.當,它顯​​示爲[ 'P2', 'P4' .......... 。''p1']#或用戶選擇的任何順序

5如果我嘗試使用其屬性調用其中一個實例,例如..... lineup [index] .name, 「str沒有名爲屬性」的錯誤消息

  1. 但是,如果我將t他在運行時間之前列出陣容= [p1,p3,..... etc](在這種情況下用戶沒有選擇)..... lineup [index] .name 工作正常。

  2. 我的問題是....我如何讓用戶創建列表,使其看起來像這樣.... [p1,p2,p3 ....]而不是['p1',' P2' ,......]

回答

0

您的代碼生成lineup與價值觀"p1""p2"字符串列表......你需要以某種方式符合他們進入到您的播放器變量之一的每個值。一個簡單(這絕對不是最好的)的方式做這將是定義一個函數:

def str_to_player(player_name): 
    if player_name == "p1": 
     return p1 
    if player_name == "p2": 
     return p2 
    .... 

請注意,此功能是相當緩慢和p1p2 ......都必須在範圍功能。看看你是否能找到更好的方式來將字符串與玩家的名字相對應!

+0

謝謝。找到這個幫助,尤其是與其他回覆聯繫在一起 – ron

0

您想使用您收到的輸入來創建Player類的實例並將其添加到列表中。例如

# Simple Player class 
class Player(object): 
    def __init__(self, name): 
     self._name = name 

    def get_name(self): 
     return self._name 

    def __repr__(self): 
     return 'Player: ' + self._name 

# Prompt for player names and return a list of Player instances 
def get_players(): 
    lineup = [] 
    for _ in range(9): 
     name = input("Enter player ... ") 
     player = Player(name) 
     lineup.append(player) 
    return lineup 

def main(): 
    lineup = get_players() 

    print(lineup) 
    print("Your Player lineup is") 
    for i, p in enumerate(lineup, 1): 
     print('{0}. {1}'.format(i, p.get_name())) 

    # Example: Prompt for position and output Player name at position 
    while True: 
     pos = input("Get player at position: ") 
     if not pos: # enter empty line to quit 
      break 

     # get a Player instance from lineup list at index 
     player_at = lineup[int(pos) - 1] 
     print("Player at position {0} is {1}".format(pos, player_at.get_name())) 

編輯:

我可能誤解了用戶如何被輸入一個名稱,認爲它是任何名稱'Bob'而不是一些關鍵('p1', 'p2', ...),因此,你可以創建一個將密鑰映射到您的Player實例的字典。

player_map = { 
    'p1': Player('player 1'), 
    'p2': Player('player 2'), 
    'p3': Player('player 3'), 
    'p4': Player('player 4'), 
    'p5': Player('player 5'), 
    'p6': Player('player 6'), 
    'p7': Player('player 7'), 
    'p8': Player('player 8'), 
    'p9': Player('player 9') 
} 

然後你就可以得到每個玩家的實例。

注意:未對人爲錯誤添加處理。例如無效的密鑰。

def get_players(): 
    lineup = [] 
    for _ in range(len(player_map)): 
     name = input("Enter player ... ") 
     lineup.append(player_map[name]) 
    return lineup 
+0

這很好。謝謝 !! – ron

0

您遇到的核心問題是,像"p1"一個字符串不是同樣的事情,一個名爲p1變量。有幾種方法可以解決此問題,以實現您的目標。

「最簡單」的方法可能是使用eval根據用戶提供的字符串查找變量。這工作,但這是一個非常糟糕的主意,因爲用戶可以鍵入任何有效的Python表達式,這將在您的程序中運行。這意味着他們可以輸入代碼來刪除硬盤,發送垃圾郵件,或者做任何他們能想到的事情。如果你不信任你的程序的所有用戶(例如,如果它可以通過互聯網訪問),那麼肯定不要這樣做!

另一種方法是隻在用戶命名時創建類的實例。如果您實際上不需要提前設置播放器實例,這可能是一個非常簡單的解決方案。在創建每個實例時,只需將用戶的字符串作爲參數傳遞給類的__init__方法即可。

第三種方法,可能是最好的方法是使用字典從名稱映射到實例,而不是使用一堆變量。變量名稱是供程序員使用的。它們通常不是應該暴露給程序用戶的數據。如果您需要將名稱關聯到對象,請使用可以在它們之間進行映射的數據結構。字典是一個很自然的選擇,因爲它在可排列的鍵(比如字符串)和任意對象(比如你的實例)之間映射。

+0

謝謝。這很有幫助 – ron