Как мне запустить два или более методов в классе, как цепочка? - PullRequest
0 голосов
/ 06 февраля 2020

Я пытаюсь выучить OOP, но меня очень смущает, как я должен запускать методы или возвращать значения. В следующем коде я хочу сначала запустить read_chapters(), затем sendData() с некоторым строковым содержимым, полученным из read_chapters(). Некоторые из найденных мной решений не использовали __init__, но я хочу использовать его (просто чтобы посмотреть / узнать, как я могу их использовать).

Как мне их запустить? Не используя __init__, почему вы возвращаете только «я»?

import datetime

class PrinceMail:

    def __init__(self):
        self.date2 = datetime.date(2020, 2, 6)
        self.date1 = datetime.date.today()
        self.days = (self.date1 - self.date2).days
        self.file = 'The_Name.txt'
        self.chapter = '' # Not sure if it would be better if i initialize chapter here-
                           # or if i can just use a normal variable later


    def read_chapters(self):
        with open(self.file, 'r') as book:
            content = book.readlines()
            indexes = [x for x in range(len(content)) if 'CHAPTER' in content[x]]
            indexes = indexes[self.days:]
            heading = content[indexes[0]]
            try:
                for i in (content[indexes[0]:indexes[1]]):
                    self.chapter += i # can i use normal                      var and return that instead?
                    print(self.chapter)
            except IndexError:
                for i in (content[indexes[0]:]):
                    self.chapter += i
                    print(self.chapter)
        return self????? # what am i supposed to return? i want to return chapter
                         # The print works here but returns nothing.

    # sendData has to run after readChapters automatically
    def sendData(self):
         pass
         #i want to get the chapter into this and do something with it


    def run(self):
        self.read_chapters().sendData()
        # I tried this method but it doesn't work for sendData
        # Is there anyother way to run the two methods?


obj = PrinceMail()
print(obj.run())
#This is kinda confusing as well

Ответы [ 3 ]

0 голосов
/ 06 февраля 2020

Прежде всего, __init__ не имеет ничего общего с тем, чего вы хотите достичь здесь. Вы можете рассматривать его как конструктор для других языков, это первая функция, которая вызывается при создании объекта класса.

Теперь, чтобы ответить на ваш вопрос, если я прав, вы просто хотите использовать вывод read_chapters в sendData. Один из способов сделать это - сделать read_chapters приватным методом (то есть, если вы не хотите, чтобы он использовался через объект), используя __ в начале имени, например __read_chapters, затем сделайте вызов функции внутри функции sendData.

Еще один момент, который необходимо учитывать, - это когда вы используете self и не собираетесь использовать функцию через объект, который вам не нужен return что угодно. self присваивает значение атрибуту текущего экземпляра. Таким образом, вы можете оставить функцию read_chapters на self.chapter = i и получить доступ к ней в sendData. Ex -

def sendData(self):
    print(self.chapter)
0 голосов
/ 06 февраля 2020

Я не эксперт, но причина для возврата self в том, что это экземпляр класса, с которым вы работаете, и это то, что позволяет вам связывать методы.

Для того, что вы пытаетесь сделать, цепочка методов не кажется лучшим подходом. Вы хотите sendData () для каждой итерации l oop in read_chapters () ? (у вас есть self.chapter = i, который всегда перезаписывается)

Вместо этого вы можете сохранить главы в списке и отправить их после всей обработки. Кроме того, и я не знаю, является ли это хорошей практикой, но у вас может быть получатель, который возвращает данные, если вы хотите сделать что-то другое с (возвращайте self.chapter вместо self )

Я бы изменил ваш код на:

import datetime

class PrinceMail:

    def __init__(self):
        self.date2 = datetime.date(2020, 2, 6)
        self.date1 = datetime.date.today()
        self.days = (self.date1 - self.date2).days
        self.file = 'The_Name.txt'
        self.chapter = []


    def read_chapters(self):
        with open(self.file, 'r') as book:
            content = book.readlines()
            indexes = [x for x in range(len(content)) if 'CHAPTER' in content[x]]
            indexes = indexes[self.days:]
            heading = content[indexes[0]]
            try:
                for i in (content[indexes[0]:indexes[1]]):
                    self.chapter.append(i)
            except IndexError:
                #not shure what you want to do here
                for i in (content[indexes[0]:]):
                    self.chapter.append(i)

        return self

    # sendData has to run after readChapters automatically
    def sendData(self):
        pass
        #do what ever with self.chapter

    def get_raw_chapters(self):
        return self.chapter

Кроме того, ознакомьтесь с Руководством по стилю PEP 8 для соглашений об именах (https://www.python.org/dev/peps/pep-0008/#function -and-variable-names )

Больше чтения в

Привязка методов - почему это хорошая практика или нет?

Что __init__ и Самостоятельно делаю на Python?

0 голосов
/ 06 февраля 2020

Методы цепочки - это просто способ сократить этот код:

temp = self.read_chapters()
temp.sendData()

Итак, все, что возвращается read_chapters, должно иметь метод sendData. Вы должны поместить все, что хотите вернуть в read_chapters в поле самого объекта (он же self), чтобы использовать его после цепочки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...