【问题标题】:No value for argument 'self' when calling a method in Python在 Python 中调用方法时参数“self”没有值
【发布时间】:2020-10-21 16:59:58
【问题描述】:

我在 stackoverflow 内外做了很多研究。是的,有类似的主题。但我找不到我的具体问题的答案。可能是因为我目前对 Python 的理解还看不到更大的图景。

在最后一行中,我收到错误“方法调用中的参数 'self' 没有值”。我将如何在这里正确调用该方法?还是根本不可能在同一个类中调用方法?

class Main:
    metronomeState = True
    currentMillis = 0
    lastMillis = 0
    intervalMillis = 0
    bpm = 120
    measureCount = 0

    def bpmToMilliInterval(self):
            self.bps = Main.bpm/60
            return int((1/self.bps)*1000)

    Main.intervalMillis = Main.bpmToMilliInterval()

这个类似乎没有理由,因为我不需要实例化它。但我想在另一个负责所有 GUI 内容的类 Gui() 中使用 Main() 的代码。所以不同的类是我组织代码的一种方式。 方法好不好?

提前感谢您的帮助!

【问题讨论】:

  • 缩进正确吗?此外,您正在类上调用假定的实例方法。你想在类定义的时候设置一个类属性吗?
  • 你的类唯一的实例属性是bps,它不是在__init__中建立的;所有其他属性都是类属性。是否应该可以创建Main 的实例?如果不是,这是一个非常奇怪的类,但您可能只想将bpmToMilliInterval 设为@classmethod(假设bps 需要在调用后保留)并且(仅用于正确的样式)将所有引用更改为selfcls。最后一行必须在类定义之外(我怀疑它在你的真实代码中,因为无论如何将它放在类中都是不合法的)。
  • 仅仅因为您可能不需要 更多 个实例并不意味着您不应该拥有 一个 个实例。如果你的类只有一个方法(可能是类方法),它可能只是一个带有很多参数的常规函数​​(其中大部分都有默认值)。

标签: python methods self method-call


【解决方案1】:

这里的问题是您编写的类没有 init 函数,而且您的类没有自变量。

例如:

class Person:

  def __init__(self):
    health = 100
    name = "Harry"


  def changeName(self,newName):

    self.name = newName

只有在有 init 功能时才有效。像 self.name 这样的 self 变量的原因是可以稍后编辑这些值,就像您尝试使用 Main.bps 一样。如果您在 init 函数中有 self.bps,则可以稍后在您的函数中对其进行编辑,前提是您还在函数中编写了 self.bps。我不确定是否在类中单独使用诸如 bpm 之类的东西,而不是 self.bps,因为我确信 bps 在 Main 忽略函数的范围内是私有的。另外,一定要检查你的缩进! :)

【讨论】:

    【解决方案2】:

    感谢您的所有 cmets!我想出了一些可行的方法。我希望它也有意义。我修复了我的缩进。

    import winsound
    import time
    
    class MetronomeCalc:
        def __init__(self):
            self.metronomeState = True
            self.currentMillis = 0
            self.lastMillis = 0
            self.intervalMillis = 0
            self.bpm = 120
            self.bps = 0
            self.bpms = 0
            self.measureCount = 0
    
        def getBpm(self):
            bpm = 120
            return bpm
    
        def bpmToMilliInterval(self):
            self.bps = self.bpm/60
            self.intervalMillis = int((1/self.bps)*1000)
    
        def playMetronome(self):
            self.bpmToMilliInterval()
            while self.measureCount < 8:
                if self.currentMillis - self.lastMillis >= self.intervalMillis:
                    self.lastMillis = int(round(time.time()*1000))
                    winsound.Beep(1000, 100)
                    self.measureCount = self.measureCount + 1
                else:
                    self.currentMillis = int(round(time.time()*1000))
    

    【讨论】:

      猜你喜欢
      • 2013-09-11
      • 2020-12-16
      • 2023-03-07
      • 2014-05-01
      • 1970-01-01
      • 2013-11-08
      • 2021-10-09
      • 2018-05-16
      • 2017-11-19
      相关资源
      最近更新 更多