首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在__init__中将全局变量集声明为方法?

如何在__init__中将全局变量集声明为方法?
EN

Stack Overflow用户
提问于 2020-10-21 12:09:40
回答 1查看 509关注 0票数 0

我是面向对象编程的新手,在声明设置为类中的方法的全局变量时遇到了一些困难。我在__init__方法中声明了它们(我希望它们在类中,而不是在外部),在这个文件中,一切都很好。但是,当我在不同的.py文件中导入类并实例化亵渎类时,会发生以下错误:UnboundLocalError: local variable 'censored_transcript' referenced before assignment。我在这个问题上做了不少研究,但找不到符合我情况的东西。global语句不起作用。有人能告诉我我怎么解决这个问题吗?非常感谢您提前!

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

代码语言:javascript
复制
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(测试文件):

代码语言:javascript
复制
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)
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-10-21 12:47:42

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

不带censored_transcriptself作为正则局部变量处理,将为每次方法调用创建新的局部变量。

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

解决方案1:在apply_filter(self)中可以使用对象的censored_transcript (而不是本地的)来保存结果。只需在它之前附加self.。并且您不需要从此方法返回某些内容:

代码语言:javascript
复制
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为其赋值。甚至忽略这个局部变量:

代码语言:javascript
复制
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)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64463210

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档