首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Python中使用类中的类变量时出现无法理解的名称错误

在Python中使用类中的类变量时出现无法理解的名称错误
EN

Stack Overflow用户
提问于 2020-10-05 23:42:17
回答 1查看 39关注 0票数 1

我是新接触面向对象编程的,并且我有以下关于类变量的问题:我想使用一个亵渎过滤器,对于这个过滤器,我有一个类Profanity,我想在__init__方法中传递一个脚本文件和一个单词列表文件作为参数。(请参阅下面的完整代码)。

生成的对象应该这样定义:p = Profanity("sample_transcript.txt", eng),其中eng代表英语,该语言参数应该可以替换为其他语言参数,如deu代表德语等。为此,我直接在class命令下面定义了类变量eng = "/home/user/sw_filter/wordlists/google_profanity_wordlist_eng.txt"deu = "/home/user/sw_filter/wordlists/profanity_wordlist_deu.txt"

我认为这些类变量在类的所有对象之间是共享的,但是当我运行代码时,我得到了错误NameError: name 'eng' is not defined。但是,当我将语言文件路径设置为全局变量时,它可以工作,但我希望它们存储在类中。有没有办法做到这一点?我做错了什么?我真的很感激我能得到的任何帮助。

非常感谢!

代码语言:javascript
复制
import re
from better_profanity import profanity 


class Profanity(object):

    # Wordlist file paths for languages
    eng = "/home/mareike/sw_filter/wordlists/google_profanity_wordlist_eng.txt"
    deu = "/home/mareike/sw_filter/wordlists/profanity_wordlist_deu.txt"
    # Further language variables...

    

    def __init__(self, transcript_filename, wordlist_language):
        self.transcript_filename = transcript_filename
        self.wordlist_language = wordlist_language
        
        
    def load_transcript(self):
        f = open(self.transcript_filename, "r")
        file = f.read()
        f.close()

        return file
    

    def load_wordlist(self):
        f = open(self.wordlist_language, "r")
        file = f.read()
        f.close()

        return file


    def preprocess(self):
        # Remove noisy punctuation
        prep_transcript = transcript.replace('--', '').replace('>', '')
        prep_transcript = prep_transcript.replace('[', '').replace(']', '')
        prep_transcript = prep_transcript.replace('(', '').replace(')', '')
        prep_transcript = prep_transcript.replace("'", '')
        prep_transcript = prep_transcript.replace('.', '')
        prep_transcript = prep_transcript.replace(';', '')
        prep_transcript = prep_transcript.replace('!', '')
        prep_transcript = prep_transcript.replace('?', '')
        prep_transcript = prep_transcript.replace('-', ' ')
        prep_transcript = re.sub(r":\B", "", prep_transcript, flags = re.MULTILINE)
        prep_transcript = re.sub(r",\D\b", " ", prep_transcript, flags = re.MULTILINE)
        prep_transcript = re.sub(r",\n", "\n", prep_transcript, flags = re.MULTILINE)

        # Lowercase text
        prep_transcript = prep_transcript.lower()

        return prep_transcript


    def apply_filter(self, prep_transcript):
        if __name__ == "__main__":
            profanity.load_censor_words_from_file(self.wordlist_language)                                                                                                             
            censored_transcript = profanity.censor(prep_transcript)

        return censored_transcript


p = Profanity("sample_transcript.txt", eng)

transcript = p.load_transcript()
wordlist = p.load_wordlist()
prep_transcript = p.preprocess()

censored_transcript = p.apply_filter(prep_transcript)
print(censored_transcript)
EN

回答 1

Stack Overflow用户

发布于 2021-02-02 18:38:06

在您的代码中,问题出在下面这一行:

代码语言:javascript
复制
p = Profanity("sample_transcript.txt", eng)

在创建对象时,您传递的第二个参数不是在该域中定义的,而是在class中定义为class属性。正如我们所知道的,类属性通常对于类的所有实例都是通用的,并且可以通过实例或类名进行访问。

所以你要做的就是像这样修改上面提到的代码行:

代码语言:javascript
复制
p = Profanity("sample_transcript.txt", Profanity.eng)
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64211907

复制
相关文章

相似问题

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