#python-3.x #oop #class-variables
#python-3.x #ооп #class-переменные
Вопрос:
Я новичок в объектно-ориентированном программировании, и у меня следующая проблема, связанная с переменными класса: я хочу использовать фильтр ненормативной лексики, для которого у меня есть класс Profanity
, и я хочу передать файл расшифровки и файл списка слов в качестве аргументов в __init__
методе. (Пожалуйста, смотрите Ниже весь код).
Результирующий объект должен быть определен следующим образом: p = Profanity("sample_transcript.txt", eng)
, где eng
означает английский, и этот языковой аргумент должен быть заменен другими языковыми аргументами, например deu
, для немецкого и т. Д.). Для достижения этой цели я определил переменные класса eng = "/home/user/sw_filter/wordlists/google_profanity_wordlist_eng.txt"
и deu = "/home/user/sw_filter/wordlists/profanity_wordlist_deu.txt"
непосредственно под class
командой.
Я думал, что эти переменные класса являются общими для всех объектов класса, но когда я запускаю код, я получаю ошибку 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",Db", " ", 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)
Комментарии:
1. Вы можете получить к ним доступ как
Profanity.eng
изнутри класса, так и извне.2. @Wups: Спасибо за ваш ответ, но, к сожалению, я все еще получаю ошибку имени. И при использовании я бы хотел, чтобы его можно было вызывать следующим образом:
p = Profanity("sample_transcript.txt", eng)
. Есть ли какой-нибудь способ сделать это?3. Да, только одно изменение:
p = Profanity("filename", Profanity.eng)
4. @Wups: Ах, теперь я вижу! Большое вам спасибо! 🙂
Ответ №1:
В вашем коде проблема связана с этой строкой:
p = Profanity("sample_transcript.txt", eng)
При создании объекта переданные вами вторые аргументы не определены в этом домене, но они определены в классе как атрибуты класса.
И, как мы знаем, атрибуты класса обычно являются общими для всех экземпляров класса, и к ним можно получить доступ либо из имени экземпляра, либо из имени класса.
Итак, что вы должны сделать, это просто изменить вышеупомянутую строку следующим образом:
p = Profanity("sample_transcript.txt", Profanity.eng)