尝试调用def时,我得到:参数'self'未填写

Tho*_*nst 7 oop class self python-2.7

我正在尝试编写一个类来从字典中随机选择一些歌曲。整个要点是能够简单地键入DJ.chooseListing()例如执行随机选择的内容。las,这给了我一个我在网上找不到的错误,我觉得答案很简单。

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()
Run Code Online (Sandbox Code Playgroud)

Blc*_*ght 8

类中定义的函数是方法。在类的实例上调用方法时,方法的第一个参数将自动填充。您正在定义一个chooseListing方法,但是当您调用它时,并不是在创建实例。如果没有实例,则没有任何内容可以作为传递self,从而导致您的异常。尝试:

dj = DJ()
dj.chooseListing()
Run Code Online (Sandbox Code Playgroud)

但是,您可能仍需要对类进行一些其他修复,因为当前它的所有属性都是类属性(所有实例都共享)。如果创建多个DJ实例,它们将共享相同的arrayChosen列表,这可能与您的意图不符。您应该将分配移动到一个__init__方法,在其中可以使它们成为实例属性(通过分配on 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 = ""
Run Code Online (Sandbox Code Playgroud)

我将Track实例放在__init__方法之外,但是如果实例的内部状态不应该在DJ之间共享,那可能是不正确的。