【问题标题】:When trying to invoke def, I get: parameter 'self' unfilled [closed]尝试调用def时,我得到:参数'self'未填充[关闭]
【发布时间】:2017-07-14 12:47:37
【问题描述】:

我正在尝试编写一个类来从字典中随机挑选一些歌曲。它的全部意义在于能够简单地键入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()

【问题讨论】:

  • 这有什么不好?我只使用标签?
  • 您在此处发布的内容将提供IndentationError。除非这是您要问的问题,否则您需要解决它。
  • 我的代码工作得很好,我使用 pycharm,到目前为止我没有遇到任何缩进问题。你能举个例子说明我做错了什么吗?
  • 您的代码可能运行良好,但您在此处发布的代码却不行。类的内容必须在class XX: 行下方缩进。请确保在粘贴 Python 代码时准确地复制缩进,否则会在要求人们阅读的代码中引入新错误。
  • 哦,是吗?,这是复制和粘贴错误,我会尽快更新

标签: python-2.7 class oop self


【解决方案1】:

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

dj = DJ()
dj.chooseListing()

您可能仍需要对您的类进行一些其他修复,因为目前它的所有属性都是类属性(由所有实例共享)。如果您创建多个 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 之间共享的内部状态,则可能不正确。

【讨论】:

  • 我尝试过您之前在这里所做的事情,重点是总共只创建一个实例。我明天再试一次,但我认为它不会像上次那样奏效..
  • 哦,嘿,这确实有效,我不知道我第一次尝试时做错了什么,无论如何,谢谢你的帮助!
猜你喜欢
  • 1970-01-01
  • 2021-06-22
  • 1970-01-01
  • 1970-01-01
  • 2014-03-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-11
相关资源
最近更新 更多