Получение «AttributeError» при попытке использовать функцию класса, которая вызывает другую функцию из этого класса внутри второго класса - PullRequest
1 голос
/ 04 июля 2019

Я пишу небольшую программу, которая использует рассол, чтобы люди могли локально сохранять свое расписание / платежную ведомость на свой компьютер.

У меня есть следующий класс:

class ScheduleDataService:

    def create_object_path(self, active_user):

        users_object_path = root / "user_objects" / active_user
        return users_object_path

    def save_users_schedule(self, users_schedule, users_object_path, active_user):
        schedule = open(users_object_path, "wb")
        pickle.dump(users_schedule, schedule)
        schedule.close()

        logger.debug("\nYour schedule has been successfully saved \n")
        logger.info(active_user + "has successfully saved their schedule.")

    def load_users_schedule(self, active_user):
        users_object_path = self.create_object_path(active_user)
        schedule = open(users_object_path, "rb")
        users_schedule = pickle.load(schedule)
        schedule.close()

        return users_schedule

Внутри этого класса я вызываю функцию класса "create_object_path" внутри функции класса "load_users_schedule".

Внутри того же модуля у меня есть второй класс, используемый для просмотра текущего расписания пользователей:

class ViewSchedule:

    __schedule_data_service: ScheduleDataService

    def __init__(self, schedule_data_service):
        self.__schedule_data_service = schedule_data_service

    def view_day(self, day_to_see, active_user):
        users_schedule = self.__schedule_data_service.load_users_schedule(self, active_user)


        to_view = []

        if day_to_see == "1":
            to_view.append("Monday")
        elif day_to_see == "2":
            to_view.append("Tuesday")
        elif day_to_see == "3":
            to_view.append("Wednesday")
        elif day_to_see == "4":
            to_view.append("Thursday")
        elif day_to_see == "5":
            to_view.append("Friday")
        elif day_to_see.lower() == "all":
            to_view = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
        else:
            logger.debug("Sorry that isn't a valid option please try again")
            logger.info(active_user + "failed to view " + day_to_see + " from their schedule due to incorrect input")
            pass

        for day in users_schedule.week:
            if day.name in to_view:
                logger.debug("")
                for session in day.sessions:
                    logger.debug("Day: " + day.name + " Class Code: " + session.code + " Class length: "
                                 + session.length)
                logger.debug("")

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

File "generator.py", line 116, in <module>
    ViewSchedule(ScheduleDataService).view_day(day_to_see, active_user)
  File "/shared/projects/pay_sheet_generator/schedule_data.py", line 249, in view_day
    users_schedule = self.__schedule_data_service.load_users_schedule(self, active_user)
  File "/shared/projects/pay_sheet_generator/schedule_data.py", line 40, in load_users_schedule
    users_object_path = self.create_object_path(active_user)
AttributeError: 'ViewSchedule' object has no attribute 'create_object_path'

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

Редактировать:

вызов ViewSchedule выглядит следующим образом

ViewSchedule(ScheduleDataService).view_day(day_to_see, active_user)

Ответы [ 2 ]

1 голос
/ 04 июля 2019

Это делает то, что вы хотите. Это полезно, если люди могут копировать и запускать ваш код. У вас есть несколько переменных и импорт, не включенный в ваш код.

import pickle
import logging

root = ""
logger = logging.getLogger()


class ScheduleDataService:

    def create_object_path(self, active_user):

        users_object_path = root + "user_objects" + active_user
        return users_object_path

    def save_users_schedule(self, users_schedule, users_object_path, active_user):
        schedule = open(users_object_path, "wb")
        pickle.dump(users_schedule, schedule)
        schedule.close()

        logger.debug("\nYour schedule has been successfully saved \n")
        logger.info(active_user + "has successfully saved their schedule.")

    def load_users_schedule(self, active_user):
        users_object_path = self.create_object_path(active_user)
        schedule = open(users_object_path, "rb")
        users_schedule = pickle.load(schedule)
        schedule.close()

        return users_schedule


class ViewSchedule:

    # This gets automatically created inside __init__       __schedule_data_service: ScheduleDataService

    def __init__(self, schedule_data_service):
        self.__schedule_data_service = schedule_data_service

    def view_day(self, day_to_see, active_user):
        users_schedule = self.__schedule_data_service.load_users_schedule(active_user)


        to_view = []

        if day_to_see == "1":
            to_view.append("Monday")
        elif day_to_see == "2":
            to_view.append("Tuesday")
        elif day_to_see == "3":
            to_view.append("Wednesday")
        elif day_to_see == "4":
            to_view.append("Thursday")
        elif day_to_see == "5":
            to_view.append("Friday")
        elif day_to_see.lower() == "all":
            to_view = ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday"]
        else:
            logger.debug("Sorry that isn't a valid option please try again")
            logger.info(active_user + "failed to view " + day_to_see + " from their schedule due to incorrect input")
            pass

        for day in users_schedule.week:
            if day.name in to_view:
                logger.debug("")
                for session in day.sessions:
                    logger.debug("Day: " + day.name + " Class Code: " + session.code + " Class length: "
                             + session.length)
                logger.debug("")


active_user = "Bob"
day_to_see = 1

scheduleDataSvc = ScheduleDataService()
vs = ViewSchedule(scheduleDataSvc)

vs.view_day(day_to_see, active_user)  
1 голос
/ 04 июля 2019

У вас есть несколько проблем в вашем коде.

  1. В строке users_schedule = self.__schedule_data_service.load_users_schedule(self, active_user) вам не нужно добавлять self в качестве первого аргумента, потому что когда вы вызываете метод класса с экземпляром, первый аргумент автоматически вставляет экземпляр этого класс

  2. Вам необходимо передать экземпляр ScheduleDataService экземпляру ViewSchedule, поэтому вам нужно будет сделать ViewSchedule(ScheduleDataService()).view_day(day_to_see, active_user) вместо ViewSchedule(ScheduleDataService).view_day(day_to_see, active_user)

  3. Также вы должны знать, что более сложные переменные искажены по имени в python, поэтому используйте их осторожно в своем классе

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