#python
#python
Вопрос:
Я хочу создать экземпляр класса Token, который принимает строку в качестве аргумента, этот класс также должен иметь метод punc, который маркирует строку в соответствии с method.instance . или выдает ошибку not implementate с сообщением. Проблема в том, что я новичок в ООП, классе, атрибуте. Я не знаю, как передать строку в качестве аргумента, и метод будет работать со строкой в соответствии со строкой, переданной в экземпляре класса.
a = Token("a-z")
a.punc("Are you sure?")
output I am looking for "a-z"
['Are','you','sure']
a = Token("c")
a.punc("Are you sure?")
output I am looking for "c"
['Are','you','sure?']
class Token:
def __init__(self,string):
self.az = "a-z"
self.c = "c"
self.string=string
if "a-z" in string:
string = string.split('?')
if "c" in string:
string = string.split()
def punc (self,string):
return self.string
на выходе я получаю a-z, который не является правильным. Я знаю, что кодировка неправильная, так как я действительно не уверен, как передать string в качестве аргумента. Любая помощь будет оценена по достоинству 🙂
Комментарии:
1. Пожалуйста, уточните, чего вы ожидаете от каждого из ваших тестовых примеров и почему. Ваши фразы не анализируются в критических местах. Я предполагаю, что вы ожидаете
split
, что обработка__init__
каким-то образом будет применяться кstring
переданной вpunc
, даже если вы специально возвращаете исходную строку, из которой вы сохранили__init__
, и игнорируете переданную вами.2. Это может помочь вам, если вы используете обычный метод отладки: убедитесь, что ваши функции имеют уникальные имена параметров, чтобы вы знали , что они не являются одной и той же переменной. Например, измените заголовок
punc
на readdef punc(self, phrase)
. Оставьте функцию создания как as__init__(self, string)
. Это не даст вам запутаться в ваших локальных переменных.3. @Prune да, теперь я могу понять, где я был неправ.
Ответ №1:
Вы ищете что-то подобное?
import re
class Token:
def __init__(self, az):
# we only initialize az in here
# which can hold only a-z or c
self.az = az
# string is empty
self.string=''
def punc(self, string):
# now we check if the az was 'a-z' or 'c'
if self.az=='a-z':
# we then remove all non alpha numeric char
# and split
self.string = re.sub(r'[^A-Za-z0-9 ] ', '', string).split()
if self.az=='c':
# or just split
self.string = string.split()
return self.string
a = Token("a-z")
print(a.punc("Are you sure?"))
b = Token("c")
print(b.punc("Are you sure?"))
Результат:
['Are', 'you', 'sure']
['Are', 'you', 'sure?']
Комментарии:
1. Не забудьте отметить ответ как правильный, если он помог 🙂
2. да, я проголосовал против, хотел бы я отметить ответ каждого как правильный, так как все решения сработали 🙂
3. о, извините, я не заметил, что вы уже выбрали правильный ответ 🙂
4. ваш ответ выбран 🙂
Ответ №2:
Посмотрите, self.string
является членом вашего класса, и у него нет ничего с параметром ‘string’, который вы передаете методу punc()
. Чтобы понять, что это значит, член класса, попробуйте распечатать a.string
. Вы получите значение, которое вы передаете во время инициализации объекта, например, «a-z».
Я думаю, вы ищете что-то вроде этого:
class Token:
def __init__(self, string):
self.string = string
def punc (self, string):
if "a-z" in self.string:
return string.split()
if c in self.stringstring::
return string.split("?")
Здесь я использую self.string
, чтобы сохранить значение вашего токена, и на основе этого значения punc()
вернет разделенную строку, которую вы передали.
Комментарии:
1. да, это сработало. Спасибо. Теперь я вижу, где я делал глупую ошибку. Эта вещь класса кажется мне запутанной.
2. Да, сначала это может показаться немного сложным, но это довольно легко понять, если вы продолжаете учиться.) и я должен был упомянуть, что все еще есть некоторые проблемы с логикой программы, потому что я исправил только часть ООП. Остальное зависит от вашей проблемы, поэтому я этого не касался
Ответ №3:
Я полагаю, что приведенное ниже должно сделать свое дело
class Token:
def __init__(self,rule):
self.rule=rule
self.text_Arr = []
def punc (self,text):
print('I am looking for "' self.rule '"' )
if "a-z" in self.rule:
text = text.split("?")
self.text_Arr = text[0].split(" ")
return self.text_Arr
elif "c" in self.rule:
self.text_Arr = text.split(" ")
return self.text_Arr
else:
print("Not implemented!")
a = Token("a-z")
print(a.punc("Are you sure?"))
b = Token("c")
print(a.punc("Are you sure?"))
Следует иметь в виду, что конструктор обычно используется для инициализации объекта.
Комментарии:
1. Спасибо. ваше решение сработало. Как новичок в python, ООП кажется мне запутанным.
2. Все в порядке, более чем рад помочь 🙂