Ошибка непонятного имени при использовании переменных класса внутри класса в Python

#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)