Использование классов для удаления стоп-слов

Интересно, смогу ли я лучше понять, как я могу решить эту проблему. У меня есть класс и подкласс, и я хочу использовать их оба.

class TextLook():
  def __init__(self, text):
    self.__text = text
  def setStopWords(self, words):
    ''' set stop words as recieved in the parameters '''
    stopWords = words.copy()
  def filteredText(self):
    ''' remove filter words from the text 
        return filtered text
    '''
    splitText = self.__text.split(" ")
    newText = [text for text in splitText if text.lower() not in stopWords]
    result = " ".join(newText)
    return result
class TextCheck(TextLook):
  def __init__(self, text):
    self.__text = text
  def getWordFrequency(self):
    ''' Call the filteredText() method
    '''
    editedWords = ta.filteredText()


ta = TextCheck("John had a car that had the roof of")
ta.setStopWords(["a", "the"])
ta.getWordFrequency()

Я создаю объект "ta" для инициализации в классе TextCheck. Затем я устанавливаю стоп-слова, и я полагаю, что они сохранены в стоп-словах? А пока я просто хочу иметь возможность разделить строку и сохранить ее в splitText. А затем используйте переменную stopWords в качестве фильтра в splitText с этим фрагментом понимания списка.

Проблема в том, что я сбит с толку тем, почему я продолжаю получать AttributeError для строки splitText:

AttributeError: 'TextCheck' object has no attribute '_TextLook__text'

Да, конечно, потому что вы используете двойное подчеркивание имени. Единственный смысл этого - избежать конфликтов имен в подклассах. Просто не используйте искажение имен с двойным подчеркиванием. Кстати, setStopwords не хранит никаких атрибутов. Он присваивается локальной переменной, stopWords но это недоступно в других методах

juanpa.arrivillaga 10.12.2020 04:54

Обратите внимание, что ваша структура классов не имеет смысла. Почему TextCheck наследуется от TextLook? Но тогда он просто использует какой-то глобальный экземпляр TextCheck.

juanpa.arrivillaga 10.12.2020 04:55

Привет, Хуанпа, спасибо за быстрый ответ. Да, имя с двойным подчеркиванием исправило эту часть с помощью AttributeError. К сожалению, это задание, над которым я работаю, и я ограничился тем, как устроены эти методы и классы. Итак, это то, что я написал до сих пор. ta.setStopWords должен ссылаться на TextLook, чтобы использовать метод setStopWords. В результате я сделал TextCheck подклассом TextLook.

HubAccess 10.12.2020 05:03

Другая проблема, с которой я сталкиваюсь, заключается в том, что переменная stopWords не сохраняется, поэтому, когда происходит строка для понимания списка, в ней говорится, что stopWords не определены. Итак, я предполагаю, что есть проблема с тем, как я создал подкласс TextCheck, если он вообще должен быть подклассом?

HubAccess 10.12.2020 05:05

«ta.setStopWords должен ссылаться на TextLook, чтобы использовать метод setStopWords. В результате я сделал TextCheck подклассом TextLook». Извините, это в принципе не имеет никакого смысла. Вы просто используете глобальную ссылку на какой-то экземпляр, который вы создаете вне класса. Это полностью упускает из виду суть ООП, заключающуюся в инкапсуляции состояния. В идеале вы должны предоставлять внешние требования к своим классам в качестве аргументов конструктору. TextCheck может принимать экземпляр TextLook в качестве аргумента.

juanpa.arrivillaga 10.12.2020 05:05

Да, я уже объяснил, вы не используете атрибут. Вы просто присваиваете значение локальной переменной. Эта переменная перестает существовать, когда функция завершается.

juanpa.arrivillaga 10.12.2020 05:07
Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
6
105
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Попробуй это.

class TextLook():
  def __init__(self, text):
    self.__text = text
  def setStopWords(self, words):
    ''' set stop words as recieved in the parameters '''
    self.stopWords = words.copy()
  def filteredText(self):
    ''' remove filter words from the text 
        return filtered text
    '''
    splitText = self.__text.split(" ")
    newText = [text for text in splitText if text.lower() not in self.stopWords]
    result = " ".join(newText)
    return result

class TextCheck(TextLook):
  def __init__(self, text):
    super().__init__(text)
    
  def getWordFrequency(self):
    ''' Call the filteredText() method
    '''
    editedWords = self.filteredText()
    return editedWords


ta = TextCheck("John had a car that had the roof of")
ta.setStopWords(["a", "the"])
ta.getWordFrequency()
def __init__ просто вызывать super бессмысленно, зачем вообще TextCheck наследовать от TextLook?
juanpa.arrivillaga 10.12.2020 05:06

Эта строка: editedWords = ta.filteredText() должна ссылаться на self, а не на ta.

NotAName 10.12.2020 05:13

В данном случае может быть. но для того, чтобы переопределить функции родительского класса, добавьте новые функции в класс без определения каких-либо новых переменных. Вам нужно только вызвать конструктор родительского класса, используя super.

Rauf Bhat 10.12.2020 05:14

@pavel, заметил и исправил. Каким-то образом это работает и с ta. Использование объектов непосредственно в классе для ссылки может стать проблемой, если вы создаете несколько объектов, поскольку self будет ссылаться на последний объект и не будет.

Rauf Bhat 10.12.2020 05:18

Спасибо за вашу помощь! Это действительно решило проблему! Добавление части «я» решило проблемы.

HubAccess 10.12.2020 05:25

Другие вопросы по теме