передать строку в качестве аргумента в экземпляре класса, должен иметь метод, который принимает string в качестве аргумента и выполняет в соответствии с instance.method

#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 на read def 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. Все в порядке, более чем рад помочь 🙂