Нет значения для аргумента «я» при вызове метода в Python

Я провел довольно много исследований как внутри, так и за пределами stackoverflow. Да, есть похожие темы. Но я не мог найти ответ на мою конкретную проблему. Может быть, потому что я пока не вижу более широкой картины с моим нынешним пониманием Python.

В последней строке я получаю сообщение об ошибке Нет значения для аргумента «я» в вызове метода. Как мне правильно вызвать метод здесь? Или вообще нельзя вызывать методы внутри одного класса?

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()

Может показаться, что для этого класса нет смысла, потому что мне не нужно его инстанцировать. Но я хочу использовать код Main() в другом классе Gui(), который отвечает за все, что связано с графическим интерфейсом. Таким образом, разные классы — это способ организации кода. Хороший подход или нет?

Заранее спасибо за помощь!


person Leonhard Wolf    schedule 21.10.2020    source источник
comment
Это отступ правильный? Кроме того, вы вызываете предполагаемый метод экземпляра класса. Вы хотите установить атрибут класса во время определения класса?   -  person schwobaseggl    schedule 21.10.2020
comment
Единственным атрибутом экземпляра вашего класса является bps, и он не установлен в __init__; все остальные атрибуты являются атрибутами класса. Предполагается ли, что можно создавать экземпляры Main? Если нет, то это очень странный класс, но вы, вероятно, захотите просто сделать bpmToMilliInterval @classmethod (при условии, что bps необходимо сохранить за пределами вызова) и (исключительно для правильного стиля) изменить все ссылки с self на cls. Эта последняя строка должна быть вне определения класса (я подозреваю, что она находится в вашем реальном коде, поскольку в любом случае было бы незаконно иметь ее внутри класса).   -  person ShadowRanger    schedule 21.10.2020
comment
Тот факт, что вам может не понадобиться больше, чем один экземпляр, не означает, что у вас не должно быть экземпляра. Если у вашего класса есть только один метод (который может быть методом класса), это может быть просто обычная функция, которая принимает множество аргументов (большинство из которых будут иметь значения по умолчанию).   -  person chepner    schedule 21.10.2020


Ответы (2)


Проблема здесь в том, что вы пишете свой класс без функции init и что в вашем классе нет собственных переменных.

Например:

class Person:

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


  def changeName(self,newName):

    self.name = newName

Работает только потому, что есть функция init. Причина использования переменных self, таких как self.name, заключается в том, что значения можно отредактировать позже, как вы пытались с Main.bps. Если у вас есть self.bps в функции init, его можно отредактировать позже в вашей функции, при условии, что вы также запишете self.bps в функцию. Я не уверен в простом использовании таких вещей, как bpm, в классе, а не в self.bps, потому что я уверен, что bps будет частным в рамках Main, не учитывая функции. Также не забудьте проверить свои отступы! :)

person Brandon Wright    schedule 21.10.2020

Спасибо за все ваши комментарии! Я придумал кое-что, что работает. Я тоже надеюсь, что это имеет смысл. И я исправил свои отступы.

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))
person Leonhard Wolf    schedule 22.10.2020