Моя функция работает сама по себе, но не может быть вызвана из класса

#python #function #class #oop

#питон #функция #класс #ООП

Вопрос:

Я сделал следующий урок:

 class Plugins:   def __init__(self):  pass     def voter_rep(self, loc, start_header, end_header):    self.loc = loc  ocr_xml = AbbyyXML(loc)  xml_doc = XMLDoc(ocr_xml, CONSTANTS)  xml_doc.split_words("", False)   self.start_header = start_header  self.end_header = end_header   header_pages = xml_doc.se_page(start_header, end_header)  ## and stuff  voter_dict = {'Voter':[], 'Record_Key':[], 'Comments':[]}  ## and stuff  return voter_dict, rep_dict  

если я запускаю функцию метода самостоятельно и вне класса, она работает совершенно нормально, а именно, если я напишу функцию как:

 def voter_rep(loc, start_header, end_header):      ocr_xml = AbbyyXML(loc)  xml_doc = XMLDoc(ocr_xml, CONSTANTS)  xml_doc.split_words("", False)    header_pages = xml_doc.se_page(start_header, end_header)  ## and stuff  voter_dict = {'Voter':[], 'Record_Key':[], 'Comments':[]}  ## and stuff  return voter_dict, rep_dict  

в одной только функции я избавляюсь self и буду просто иметь voter_rep(loc, start_header, end_header) , но когда я хочу вызвать ее из класса, я делаю plugins.voter_rep(loc, start_header, end_header) то, что не работает, и она возвращает:

 NameError: name 'plugins' is not defined  

Интересно, почему моя функция работает сама по себе, но не может быть вызвана из класса?

Ответ №1:

Вы можете сделать

 plugins = Plugins() loc = #some val start_header = #some val end_header = #some val plugins.voter_rep(loc, start_header, end_header)  

Как видно из сообщения об ошибке, вы используете маленькую букву «р» вместо заглавной. Кроме того, поскольку это не статическая функция, поэтому не стоит называть ее именем класса.

Ответ №2:

 Plugins.voter_rep(loc, start_header, end_header)  

Обратите внимание на заглавную букву.

Комментарии:

1. Но в этом случае возникает вопрос: почему эта функция вообще является методом класса?

2. Моя глупая ошибка 😛

3. @Matthias, потому что это часть а большего модуля…