我如何在其他类Python中调用导入类

时间:2017-01-08 00:51:55

标签: python-2.7

#!/usr/bin/env python

from __future__ import print_function

import sys
import time
import getopt
import alsaaudio
import numpy
from time import sleep


    class A_weight():

        def __init__(self):
            skaler = 2.361E-14
            fix_cur = 0.20565360419770495
            A = []
            hPa = 4e-11
            card = 'default'
            array_float = numpy.dtype(float)
            stream = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, card)
            stream.setchannels(1)
            stream.setrate(48000)
            stream.setformat(alsaaudio.PCM_FORMAT_S16_LE)
            stream.setperiodsize(128)

       def A(f):
            return (12200**2*f**4/((f**2+20.6**2)*(f**2+12200**2)*numpy.sqrt(f**2+107.7**2)*numpy.sqrt(f**2+737.9**2)))+fix_cur

       def listen(self):
            glob_leq = 0
            liczba_ramek = 0
            index_ramek = 0
            while True:
                try:
                   l, data = stream.read()
                except IOError, e:
                   error_count += 1
                   print(" (%d) Error recording: %s" % (error_count, e))
                else:
                   if l==128:
                       decoded_block = numpy.frombuffer(data, dtype='int16' )
                   else:
                    continue
                Y = numpy.fft.fft(decoded_block) # fft computing and normalization
                Aw = A(numpy.arange(20.,20000,(19980./len(Y))))
                Na = Aw*Y
                inverse = numpy.fft.ifft(Y)
                maks = 32768
                array_float = numpy.divide(inverse.real ,float( maks))
                array_float = array_float**2
                sum_array = numpy.sum(array_float, dtype=float)
                glob_leq = glob_leq + sum_array
                liczba_ramek += 1
                index_ramek += 1
                if index_ramek == 375:
                   index_ramek=0
                   cis_chwil = numpy.divide(glob_leq, liczba_ramek * 128)
                   leq =10*numpy.log10(numpy.divide(cis_chwil, hPa))
                   print (leq)
                   #A.append(leq)
                   #print(max(A))
A_weight().listen()

所以我尝试用加权A编写程序计算声压级。 所有工作都正确,但当我想要关闭可能代码在课堂上我有问题。因为在这种情况下调用导入类的错误是alsaaudio。 我得到了这个反馈:

Traceback (most recent call last):
File "rec_A.py", line 64, in <module>
A_weight().listen()
File "rec_A.py", line 37, in listen
l, data = stream.read()
NameError: global name 'stream' is not defined

你有什么想法

1 个答案:

答案 0 :(得分:0)

stream的每次出现更改为self.stream

class A_weight():

    def __init__(self):
        skaler = 2.361E-14
        fix_cur = 0.20565360419770495
        A = []
        hPa = 4e-11
        card = 'default'
        array_float = numpy.dtype(float)
        self.stream = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, card)
        self.stream.setchannels(1)
        self.stream.setrate(48000)
        self.stream.setformat(alsaaudio.PCM_FORMAT_S16_LE)
        self.stream.setperiodsize(128)

    ...

    def listen(self):
        glob_leq = 0
        liczba_ramek = 0
        index_ramek = 0
        while True:
            try:
               l, data = self.stream.read()

    ...

这将使它成为一个实例变量,并且该类的所有其他方法(只要它们传递self参数)将通过self.stream访问它。有关实例变量的详细信息,请参阅this bit of documentation

此外,这仅仅是一个美学点,但Python中的惯例是对类名称使用上层驼峰案例,即AWeight而不是A_weight - 但这不会影响代码的方式运行。