2014-06-18 9 views
0

Je voudrais prendre une liste de joueurs de football (qui ont peu d'attributs comme le nom, les buts, le club ...) et les ajouter à leur club (qui est une autre classe) mais il semble qu'il me manque quelque chose parce que la liste des joueurs du club change dans la boucle même si elle n'est pas appelée (je pense que je ne gère pas correctement les instances des joueurs).Générer la liste des instances en Python

Alors, voici le code:

clubsWithGoal = [] 

class Player: 
nickname = "" 
imageURL = "" 
numberOfGoal = 0 
clubId = "" 

def __init__(self, nickname, imageURL, clubId, numberOfGoal = 0): 
    self.nickname = nickname 
    self.imageURL = imageURL 
    self.clubId = clubId 
    self.numberOfGoal = numberOfGoal 

def __str__(self): 
    return self.nickname 


class Club: 
Name = "" 
ImageURL = u"" 
id = u"" 
numberOfGoal = 0 
listOfPlayer = [] 

def __init__(self, id): 
    del self.listOfPlayer [:] 
    self.id = id 
    self.getData() 

def __str__(self): 
    return self.Name 

def getData(self): 
    try: 
     results = json.load(urllib.urlopen(
      "http://worldcup.kimonolabs.com/api/clubs/" + self.id + "?apikey={youwon'tseeit}")) 
     self.ImageURL = results["logo"] 
     self.Name = results["name"] 
    except: 
     print(self.id) 

def addGoal(self, numberOfGoalsToAdd): 
    self.numberOfGoal += numberOfGoalsToAdd 

def addPlayer(self, player): 
     self.listOfPlayer.append(player) 
     print("added "+player.nickname+" to "+self.Name) 
     self.addGoal(player.numberOfGoal) 
     print("added the "+str(player.numberOfGoal)+" of "+player.nickname+" to "+self.Name) 

Voici donc pour la classe modèle et est la fonction ici qui doit trier les joueurs et ne fonctionne pas:

def createAndOrderInClub(playerlist): 
foundHisClub = False 
for player in playerlist: 
    for club in clubsWithGoal: 
     # Case 1: The club already exists and the player is part of the club 
     if player.clubId == club.id: 
      club.addPlayer(player) 
      foundHisClub = True 
      break 
    # Case 2: The club doesn't already exist 
    if (foundHisClub == False): 
     newclub = Club(player.clubId) 
     newclub.addPlayer(player) 
     clubsWithGoal.append(newclub) 

Et un exemple que cela change à l'intérieur de la boucle (je suis développeur java et nouveau pour Python): J.Bausejour is a player of Wigan ...and was replaced by Alonso, I don't know why

+0

Peut-être lié: http://stackoverflow.com/q/1680528/3001761 – jonrsharpe

+0

Oui, c'est double réponse: la réponse est la même, mais il était tout à fait compliqué de deviner que le problème était le même (au moins pour moi), désolé. –

Répondre

1

Je pense que le problème est que la variable listOfPlayer dans la classe Club est déclarée en tant que membre de classe statique et n'est pas initialisée dans la fonction __init__. Cette démo http://dbgr.cc/R montre le point. Outre l'erreur ci-dessus, il semble également que vous ne réinitialisez pas la variable foundHisClub à l'intérieur de la boucle à False. Je place déclarer la variable foundHisClub dans la première boucle:

def createAndOrderInClub(playerlist): 
    for player in playerlist: 
     foundHisClub = False 
     for club in clubsWithGoal: 
      # Case 1: The club already exists and the player is part of the club 
      if player.clubId == club.id: 
       club.addPlayer(player) 
       foundHisClub = True 
       break 
     # Case 2: The club doesn't already exist 
     if (foundHisClub == False): 
      newclub = Club(player.clubId) 
      newclub.addPlayer(player) 
      clubsWithGoal.append(newclub) 
1

Le conteneur listOfPlayer, comme vous l'avez déclaré, est une "variable de classe" (un peu comme un membre de classe statique dans java), et comme les listes sont mutables, chaque fois que vous modifiez cette liste dans Club, elle change pour tous instances aussi bien.

Pour résoudre ce problème il suffit de retirer de la définition de la classe, et initialiser la liste dans la fonction __init__ (les chaînes ne sont pas problématiques car ils sont immuables):

class Club: 
    Name = "" 
    ImageURL = u"" 
    id = u"" 
    numberOfGoal = 0 

    def __init__(self, id): 
     self.listOfPlayer = []  
     self.id = id 
     self.getData() 
+0

Merci pour votre réponse, comme je l'ai dit je suis nouveau à python et n'a pas très bien intégré ces variables de classe statique. Je vous ai upvoted mais je ne donnerai pas le tick parce que j'ai choisi nOOb cODEr (pour sa démo et la deuxième erreur) et parce qu'il n'a que 31 points.Merci pour votre aide –

1
listOfPlayer = [] 

C'est une classe attribut, ce qui signifie qu'il est partagé pour toutes les instances de votre classe Club. Si vous venez de Java, vous pouvez considérer cela comme une variable de classe statique. Pour rendre cette liste unique pour chaque classe Club, assurez-vous de l'initialiser dans le constructeur avec le préfixe self.

def __init__(self, id): 
    del self.listOfPlayer [:] 
    self.id = id 
    self.listOfPlayer = [] 
    self.getData() 

Assurez-vous de faire la même chose pour toutes les autres variables que vous avez définies au niveau de la classe:

Name = "" 
ImageURL = u"" 
id = u"" 
numberOfGoal = 0 

Enlevez ces, et les initialiser dans le constructeur en utilisant self.

+0

Merci pour votre réponse, comme je l'ai dit je suis nouveau à python et n'a pas très bien intégré ces variables de classe statique. Je vous ai upvoted mais je ne donnerai pas le tick parce que j'ai choisi nOOb cODEr (pour sa démo et la deuxième erreur) et parce qu'il n'a que 31 points. Merci de votre aide –

Questions connexes