首页 > 解决方案 > 如何在 Python 的 __init__ 中声明一个设置为方法的全局变量?

问题描述

我是面向对象编程的新手,在声明设置为类中方法的全局变量时遇到了一些麻烦。我在方法中声明了它们__init__(我希望它们在类内,而不是在类外)self.censored_transcript = self.apply_filter(),并且在这个文件中,一切正常。但是当我在不同的 .py 文件中导入类并实例化 Profanity 类时,会出现以下错误:UnboundLocalError: local variable 'censored_transcript' referenced before assignment. 我已经对这个主题进行了相当多的研究,但找不到任何适合我的情况。该global声明不起作用。谁能告诉我如何解决这个问题?非常感谢您!

文件 1(要导入的文件),称为profanity_filter.py

from better_profanity import profanity


class Profanity(object):

    def __init__(self, transcript_filename, wordlist_filename):
        self.__transcript_filename = transcript_filename
        self.__wordlist_filename = wordlist_filename

        self.__transcript = self.__load_transcript()
        self.censored_transcript = self.apply_filter()

    def __load_transcript(self):
        f = open(self.__transcript_filename, "r")
        file = f.read()
        f.close()

        return file

    def apply_filter(self):
        if __name__ == "__main__":
            profanity.load_censor_words_from_file(self.__wordlist_filename)
            censored_transcript = profanity.censor(self.__transcript)

        return censored_transcript

文件 2(测试文件):

from profanity_filter import Profanity


# Instantiate the Profanity class:
p = Profanity("sample_transcript.txt", "profanity_wordlist.txt")


# Apply the profanity filter.
censored_transcript = p.apply_filter()
print(censored_transcript)

标签: python-3.xclassoopglobal-variables

解决方案


您可以self.censored_transcript在类内的所有地方使用 -self指类的当前对象。您的类的每个创建的对象都将存储自己self的可用变量集。

censored_transcriptself被视为常规局部变量,它将为每次方法调用新创建。

错误原因:def apply_filter(self)从外部 .py 文件调用方法时,检查将为 false,并且不会在该方法内部创建if __name__ == "__main__"局部变量。censored_transcript因此,return censored_transcript尝试返回具有未分配值的局部变量并失败。

解决方案1:apply_filter(self)您可以使用对象而censored_transcript不是本地来保存结果。只是在它之前追加self.。你不需要从这个方法返回一些东西:

from better_profanity import profanity


class Profanity(object):

    def __init__(self, transcript_filename, wordlist_filename):
        self.__transcript_filename = transcript_filename
        self.__wordlist_filename = wordlist_filename

        self.__transcript = self.__load_transcript()
        self.apply_filter()  # changed

    def __load_transcript(self):
        f = open(self.__transcript_filename, "r")
        file = f.read()
        f.close()

        return file

    # changed
    def apply_filter(self):
        profanity.load_censor_words_from_file(self.__wordlist_filename)
        self.censored_transcript = profanity.censor(self.__transcript)

解决方案 2:使用局部变量,但在没有if. 甚至可以省略这个局部变量:

from better_profanity import profanity


class Profanity(object):

    def __init__(self, transcript_filename, wordlist_filename):
        self.__transcript_filename = transcript_filename
        self.__wordlist_filename = wordlist_filename

        self.__transcript = self.__load_transcript()
        self.censored_transcript = self.apply_filter()

    def __load_transcript(self):
        f = open(self.__transcript_filename, "r")
        file = f.read()
        f.close()

        return file

    # changed
    def apply_filter(self):
        profanity.load_censor_words_from_file(self.__wordlist_filename)
        return profanity.censor(self.__transcript)

推荐阅读