2017-02-23 1 views
0

J'essaye d'écrire une classe pour choisir aléatoirement un nombre de chansons d'un dictionnaire. Le but de tout cela est de pouvoir taper simplement DJ.chooseListing() par exemple pour exécuter la sélection aléatoire. Hélas, cela me donne une erreur que je ne trouve nulle part ailleurs sur le web, et je pense que la réponse est très simple.Lorsque j'essaie d'invoquer def, j'obtiens: le paramètre 'self' non rempli

class DJ: 
    # put song variables here in this format: trackName = Track("string of song to be displayed", 'music/filename.ogg') 
    trackRickAstleyNever = Track("Never gonna give you up", 'music/rick.ogg') 
    trackShootingStars = Track("Shooting Stars", 'music/shoot.ogg') 

    dictSongs = { 
     # put songs here like this: 'name': varName, 
     'nevergonnagiveyouup': trackRickAstleyNever, 
     'shootingstars': trackShootingStars, 

    } 
    """ 
    arrayRandomized = [ 
     # Put future songs here in this format: songs['name'], 
    ] 
    """ 
    arrayChosen = [] 
    trackChosen = "" 

    def chooseListing(self): 
     for i in xrange(4): 
      self.arrayChosen.append(random.choice(self.dictSongs)) 

    def chooseTrack(self): 
     self.trackChosen = random.choice(self.arrayChosen) 

DJ.chooseListing() 
+3

Fixez votre indentation. Le code Python mal indenté est un non-sens. – khelwood

+0

Qu'est-ce qui est mauvais à ce sujet? Je viens d'utiliser des onglets? –

+0

Ce que vous avez posté ici donnera un 'IndentationError'. À moins que ce soit le problème que vous posez, vous devez le réparer. – khelwood

Répondre

0

Une fonction définie dans une classe est une méthode. Le premier argument d'une méthode sera rempli automatiquement lorsque vous l'appellerez sur l'instance de la classe. Vous définissez une méthode chooseListing, mais lorsque vous l'appelez, vous ne créez pas d'instance. S'il n'y a pas d'instance, rien ne peut être passé comme self, ce qui conduit à votre exception. Essayez:

dj = DJ() 
dj.chooseListing() 

Vous pouvez encore besoin de faire quelques autres correctifs à votre classe mais, puisque actuellement tous ses attributs sont des attributs de classe (qui sont partagées par toutes les instances). Si vous créez plusieurs instances DJ, elles partageront toutes la même liste arrayChosen, ce qui n'est probablement pas ce que vous avez l'intention de faire. Vous devez déplacer vos tâches à une méthode __init__, où vous pouvez les faire attributs d'instance (en attribuant le self):

def __init__(self): 
    self.dictSongs = { # this might still make sense as a class attribute if it is constant 
     'nevergonnagiveyouup': trackRickAstleyNever, 
     'shootingstars': trackShootingStars, 
     } 
    self.arrayChosen = [] # these however should certainly be instance attributes 
    self.trackChosen = "" 

J'ai quitté les Track cas de la méthode __init__, mais cela pourrait ne pas être correcte si elles avoir un état interne qui ne devrait pas être partagé entre DJs.

+0

J'ai essayé de faire ce que vous faisiez précédemment, aussi le but est de ne faire qu'un exemple au total. Je vais essayer ça encore demain, mais je ne pense pas que ça marchera comme ça n'a pas été la dernière fois .. –

+0

Oh hey ça a vraiment marché, je ne vois pas ce que j'ai fait de mal la première fois que je l'ai essayé, de toute façon , Merci pour l'aide!! –