【问题标题】:Error:__init__() missing 1 required positional argument: 'rec'错误:__init__() 缺少 1 个必需的位置参数:'rec'
【发布时间】:2020-08-13 06:50:54
【问题描述】:

我是 python 新手。我正在尝试制作应该检测、收听、记录和写入 .wav 文件的麦克风文件。但是,当我尝试运行文件时,它给了我一个错误。意思是:

TypeError: __init__() missing 1 required positional argument: 'rec'

下面的listen() 也有同样的问题。这是我的代码:

class Recorder:
# compute the rms
def rms(frame):
    count = len(frame) / swidth
    format = "%dh" % (count)
    shorts = struct.unpack(format, frame)

    sum_squares = 0.0
    for sample in shorts:
        n = sample * SHORT_NORMALIZE
        sum_squares += n * n
    rms = math.pow(sum_squares / count, 0.5);
    return rms * 1000

# create an interface to portaudio
@staticmethod
def __init__(rec):
    rec.p= pyaudio.PyAudio()
    rec.stream= rec.p.open(format=FORMAT, channels=CHANNELS, rate=RATE,input=True,output=True,frames_per_buffer=chunk)

# record the detected sound
def record(rec):
    print('sound detected, record begin')
    frames = []
    current = time.time()
    end = current + Timeout
    while current <= end:
        data = rec.stream.read(chunk, execption_on_overflow=False)
        if rec.rms(data) >= Threshold:
            end = time.time() + Timeout
        current = time.time()
        frames.append(data)
    rec.write(b''.join(frames))

# write the recorded sound to .wav file
def write(rec, recording):
    files = len(os.listdir(FileNameTmp))
    filename = os.path.join(FileNameTmp,time.strftime('%Y_%m_%d-%H_%H_%M_%S.wav'.format(FORMAT)))
    filename2 = time.strftime('%Y_%m_%d-%H_%H_%M_%S.wav'.format(FORMAT))
    wf = wave.open(filename, 'wb')
    wf.setnchannels(CHANNELS)
    wf.setsampwidth(rec.p.get_sample_size(FORMAT))
    wf.setframerate(RATE)
    wf.writeframes(recording)
    wf.close()
    print('Written to file: {}'.format(filename))
    print('Returning to listening')

# listen to the sound
def listen(rec):
    print('Listening beginning')
    while True:
        input = rec.stream.read(chunk, execption_on_overflow=False)
        rms_val = rec.rms(input)
        if rms_val > Threshold:
            rec.record()
k = Recorder()
k.listen()

【问题讨论】:

    标签: python python-3.x microphone


    【解决方案1】:

    您将__init__ 声明为staticmethod,因此当您创建类的对象时,没有self(或者在您的情况下为rec)参数传递给您的构造函数。

    k = Recorder() <--- will pass a reference, typical named self, into your __init__
    

    请看一下

    1. this
    2. or this
    3. and this

    当你想使用静态构造函数时。

    【讨论】:

      【解决方案2】:

      您的代码中有很多问题,其中一个是成员函数的第一个参数必须是self(如this 指针)。这是因为,python 的哲学是,

      显式优于隐式

      一般来说,一个python类是这样的:

      class MyClass:
          def __init__(self, val):
              self.val = val
      
          def getVal(self):
              return self.val
      
          def setVal(self, val):
              self.val = val
      
      obj = MyClass(5)
      print(obj.getVal()) # prints 5
      obj.setVal(4)
      print(obj.getVal()) # prints 4
      

      当您将代码重构为上述语法时,您的代码将开始工作。另外,一定要买一些系统地介绍python的书:)

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2022-01-11
        • 2019-06-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多