Самый компактный и аккуратный способ переопределения функции в классе? - PullRequest
0 голосов
/ 09 ноября 2018

Я пытаюсь написать класс для манипулирования текстом. Идея в том, что класс будет поддерживать базовую предварительную обработку текста, но если кто-то хочет написать очень сложную функцию предварительной обработки, он должен иметь возможность использовать базовый класс и переопределить его. Я попробовал следующий способ, хотя я могу как-то заставить его работать, я не думаю, что это правильный способ сделать это.

class TextPreprocessor:
    def __init__(self, corpus):
        """Text Preprocessor base class.

            corpus: a list of sentences

        """
        self.corpus      = corpus
        self.word_tokens = [self.preprocess(sentence) for sentence in corpus]

    def preprocess(self,sentence):
        """
        strip each sentence , lowercase it and split by space # sentence.strip().lower().split()

        """

        return sentence.strip().lower().split()

    def preprocess_transform(self,sentence):

        return self.preprocess(sentence)

Теперь, если я хочу написать новую функцию предварительной обработки, которая является лучшим способом сделать это. Я попробовал следующее,

class SubPreprocess(TextPreprocessor):
    def __init__(self, corpus):
        #### dummy preprocess function
        def preprocess(self, sentence):
            return sentence.strip().split() + ['HELLOOOOOOOOOOLLLL']
        super.__init__(corpus)

Это не работает. По сути, я хочу, чтобы функция предварительной обработки (модифицированная) могла иметь возможность переопределять функцию в базовом классе TextPreprocessor, поэтому при вызове этой __init__ self.word_tokens должна основываться на новой функции предварительной обработки

Ответы [ 4 ]

0 голосов
/ 09 ноября 2018

попробуйте изменить: super. init (корпус) в супер (). init (корпус)

0 голосов
/ 09 ноября 2018
class SubPreprocess(TextPreprocessor):
    def __init__(self, corpus):
        #this is how you initialise the superclass
        super(SubPreprocess, self).__init__(corpus)

    # the overridden function should be within the scope of the class, not under the initializer
    def preprocess(self, sentence):
        return sentence.strip().split() + ['HELLOOOOOOOOOOLLLL']
0 голосов
/ 09 ноября 2018

Если вы хотите ввести поведение, просто используйте функцию:

class TheAlgorithm:
  def __init__(self, preprocess):
     self.preprocess = preprocess
  def process(self, corpus):
     after_a = self.part_a(corpus)
     preprocessed = self.preprocess(after_a)
     return self.part_b(preprocessed)

Используйте очень просто:

p = TheAlgorithm(lambda c: c.strip().split() + 'helllol')
p.process('the corpus')

На самом деле, если весь ваш класс хранит некоторые функции, вы можете перейти к полнофункциональному программированию:

def processor(preprocess):
   def algorithm(corpus):
      return part_b( preprocess(corpus) )

p = processor(lambda c: "-".join(c.split(",")))
assert "a-b-c" == p("a,b,c")
0 голосов
/ 09 ноября 2018

Будет делать следующее:

class SubPreprocess(TextPreprocessor):
    def preprocess(self, sentence):
        return sentence.strip().split() + ['HELLOOOOOOOOOOLLLL']

Если вы теперь вызовете конструктор SubPreprocess, будет использован новый метод preprocess:

proc = SubPreprocess(some_corpus)  
# looks up any methods in the mro of SubPreprocess
...