我是新接触面向对象编程的,并且我有以下关于类变量的问题:我想使用一个亵渎过滤器,对于这个过滤器,我有一个类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。但是,当我将语言文件路径设置为全局变量时,它可以工作,但我希望它们存储在类中。有没有办法做到这一点?我做错了什么?我真的很感激我能得到的任何帮助。
非常感谢!
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)发布于 2021-02-02 18:38:06
在您的代码中,问题出在下面这一行:
p = Profanity("sample_transcript.txt", eng)在创建对象时,您传递的第二个参数不是在该域中定义的,而是在class中定义为class属性。正如我们所知道的,类属性通常对于类的所有实例都是通用的,并且可以通过实例或类名进行访问。
所以你要做的就是像这样修改上面提到的代码行:
p = Profanity("sample_transcript.txt", Profanity.eng)https://stackoverflow.com/questions/64211907
复制相似问题