尝试调用 def 时,我得到:parameter 'self' unfilled
When trying to invoke def, I get: parameter 'self' unfilled
我正在尝试编写 class 从字典中随机挑选一些歌曲。它的重点是能够简单地键入 DJ.chooseListing()
来执行随机选择。唉,它给了我一个错误,我在网上其他任何地方都找不到,我觉得答案很简单。
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()
在class中定义的函数是一个方法。当您在 class 的实例 上 调用方法时,方法的第一个参数将自动填充。您正在定义一个 chooseListing
方法,但是当您调用它时,您并没有创建一个实例。如果没有实例,则没有任何东西可以作为 self
传递,这会导致您的异常。尝试:
dj = DJ()
dj.chooseListing()
尽管如此,您可能仍需要对 class 进行一些其他修复,因为目前它的所有属性都是 class 属性(所有实例共享)。如果您创建多个 DJ
实例,它们将共享同一个 arrayChosen
列表,这可能不是您想要的。您应该将您的分配移动到 __init__
方法,在那里您可以使它们成为实例属性(通过在 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 = ""
我将 Track
实例排除在 __init__
方法之外,但如果它们具有不应在 DJ 之间共享的内部状态,那可能不正确。
我正在尝试编写 class 从字典中随机挑选一些歌曲。它的重点是能够简单地键入 DJ.chooseListing()
来执行随机选择。唉,它给了我一个错误,我在网上其他任何地方都找不到,我觉得答案很简单。
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()
在class中定义的函数是一个方法。当您在 class 的实例 上 调用方法时,方法的第一个参数将自动填充。您正在定义一个 chooseListing
方法,但是当您调用它时,您并没有创建一个实例。如果没有实例,则没有任何东西可以作为 self
传递,这会导致您的异常。尝试:
dj = DJ()
dj.chooseListing()
尽管如此,您可能仍需要对 class 进行一些其他修复,因为目前它的所有属性都是 class 属性(所有实例共享)。如果您创建多个 DJ
实例,它们将共享同一个 arrayChosen
列表,这可能不是您想要的。您应该将您的分配移动到 __init__
方法,在那里您可以使它们成为实例属性(通过在 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 = ""
我将 Track
实例排除在 __init__
方法之外,但如果它们具有不应在 DJ 之间共享的内部状态,那可能不正确。