Интересно, смогу ли я лучше понять, как я могу решить эту проблему. У меня есть класс и подкласс, и я хочу использовать их оба.
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'
Обратите внимание, что ваша структура классов не имеет смысла. Почему TextCheck
наследуется от TextLook
? Но тогда он просто использует какой-то глобальный экземпляр TextCheck
.
Привет, Хуанпа, спасибо за быстрый ответ. Да, имя с двойным подчеркиванием исправило эту часть с помощью AttributeError. К сожалению, это задание, над которым я работаю, и я ограничился тем, как устроены эти методы и классы. Итак, это то, что я написал до сих пор. ta.setStopWords должен ссылаться на TextLook, чтобы использовать метод setStopWords. В результате я сделал TextCheck подклассом TextLook.
Другая проблема, с которой я сталкиваюсь, заключается в том, что переменная stopWords не сохраняется, поэтому, когда происходит строка для понимания списка, в ней говорится, что stopWords не определены. Итак, я предполагаю, что есть проблема с тем, как я создал подкласс TextCheck, если он вообще должен быть подклассом?
«ta.setStopWords должен ссылаться на TextLook, чтобы использовать метод setStopWords. В результате я сделал TextCheck подклассом TextLook». Извините, это в принципе не имеет никакого смысла. Вы просто используете глобальную ссылку на какой-то экземпляр, который вы создаете вне класса. Это полностью упускает из виду суть ООП, заключающуюся в инкапсуляции состояния. В идеале вы должны предоставлять внешние требования к своим классам в качестве аргументов конструктору. TextCheck
может принимать экземпляр TextLook
в качестве аргумента.
Да, я уже объяснил, вы не используете атрибут. Вы просто присваиваете значение локальной переменной. Эта переменная перестает существовать, когда функция завершается.
Попробуй это.
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
?
Эта строка: editedWords = ta.filteredText()
должна ссылаться на self
, а не на ta
.
В данном случае может быть. но для того, чтобы переопределить функции родительского класса, добавьте новые функции в класс без определения каких-либо новых переменных. Вам нужно только вызвать конструктор родительского класса, используя super.
@pavel, заметил и исправил. Каким-то образом это работает и с ta. Использование объектов непосредственно в классе для ссылки может стать проблемой, если вы создаете несколько объектов, поскольку self будет ссылаться на последний объект и не будет.
Спасибо за вашу помощь! Это действительно решило проблему! Добавление части «я» решило проблемы.
Да, конечно, потому что вы используете двойное подчеркивание имени. Единственный смысл этого - избежать конфликтов имен в подклассах. Просто не используйте искажение имен с двойным подчеркиванием. Кстати,
setStopwords
не хранит никаких атрибутов. Он присваивается локальной переменной,stopWords
но это недоступно в других методах