2016-08-17 13 views
0

最初に私は答えを探していたが、それを見つけることができず、とても基本的な質問を申し訳なく思う.TTSでプログラムを作った。私は "list_merge"というグローバル変数を作成しましたが、大部分のあなたはグローバル変数が悪いと言いました。だから私はこのリストをinitに入れることにしました。 PS。空白を無視すると、それらはここにコピーされているためにのみ存在します。Pythonの属性エラーを解決するには

エラーは次のとおりです。 はAttributeErrorは: 'Ver2ProjectWithTTS' オブジェクトが属性 'list_merge'

どれを持っていない: 'Ver2ProjectWithTTS' オブジェクトには属性 'list_merge' 私は はAttributeErrorを取得しています

import json 
import pyttsx 
from openpyxl import load_workbook 

class Ver2ProjectWithTTS(object): 

    def __init__(self): 
     self.read_json_file() 
     self.read_xml_file() 
     self.say_something() 
     self.list_merge = [] 

    def read_json_file(self): 
     with open("json-example.json", 'r') as df: 
      json_data = json.load(df) 
      df.close() 
     for k in json_data['sentences']: 
      text_json = k['text'] 
      speed_json = int(k['speed']) 
      volume_json = float(k['volume']) 
      dict_json = {'text': text_json, 'speed': speed_json, 'volume': volume_json} 
      self.list_merge.append(dict_json) 

    def read_xml_file(self): 
     tree = et.parse('xml-example.xml') 
     root = tree.getroot() 
     for k in range(0, len(root)): 
      text_xml = root[k][0].text 
      speed_xml = int(root[k][1].text) 
      volume_xml = float(root[k][2].text) 
      dict_xml = {'text': text_xml, 'speed': speed_xml, 'volume': volume_xml} 
      self.list_merge.append(dict_xml) 

    def say_something(self): 
     for item in self.list_merge: 
      engine = pyttsx.init() 
      engine.getProperty('rate') 
      engine.getProperty('volume') 
      engine.setProperty('rate', item['speed']) 
      engine.setProperty('volume', item['volume']) 
      engine.say(cleared_text) 
      engine.runAndWait() 

if __name__ == '__main__': 
    a = Ver2ProjectWithTTS() 

を持っていませんどのようにこのエラーを避けるためにアイデア?まあ私は客観性が良くなく、私はこれを修正せずに動きません。 PS。 init defの前にグローバル変数で正しく動作しました。助けを おかげで:)

+0

どのような行がこのエラーを送出していますか? – dhdavvie

+0

AttributeError: 'Ver2ProjectWithTTS'オブジェクトに 'list_merge'属性がありません。 – degath

+1

構文の一部である場合、 '空白を無視する'のは難しいです。それは実際のインデントですか? – polku

答えて

3

あなたはそれを使用する前に、最初の場合に設定する必要があります。

class Ver2ProjectWithTTS(object): 

    def __init__(self): 
     # first set it 
     self.list_merge = [] 
     self.read_json_file() 
     self.read_xml_file() 
     self.say_something() 

はとにかくコンストラクタ内の任意の高度なロジックをしない、それは良い習慣ではありません。代わりに方法を作成してください:

class Ver2ProjectWithTTS(object): 

    def __init__(self): 
     # first set it 
     self.list_merge = [] 

    def do_the_job(self): 
     self.read_json_file() 
     self.read_xml_file() 
     self.say_something() 

    ... 

instance = Ver2ProjectWithTTS() 
instance.do_the_job() 
+0

ありがとう、素晴らしい答え。 :-) – degath