如何解决 python 中的属性错误

How to resolve attribute error in python

一开始我会说我一直在寻找答案,但找不到答案,很抱歉 question.I 使用 TTS 创建了如此基本的程序。我创建了名为 "list_merge" 的全局变量,但你们大多数人都说全局变量很糟糕。所以我决定把这个列表放在 init 中。 PS。忽略空格,它们存在只是因为我把它复制到这里。

错误是: AttributeError: 'Ver2ProjectWithTTS' 对象没有属性 'list_merge'

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

我正在 AttributeError: 'Ver2ProjectWithTTS' 对象没有属性 'list_merge'

有什么办法可以避免这个错误吗?好吧,我的客观性不好,如果不解决这个问题,我就无法继续前进。 PS。在 init def 之前使用全局变量可以正常工作。 感谢您的帮助:)

使用前必须先设置if:

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