【发布时间】:2019-07-04 04:39:10
【问题描述】:
我正在编写一个小程序,它使用 pickle 让人们在本地将他们的时间表/工资单保存到他们的计算机上。
我有以下课程:
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
在这个类中,我在类函数“load_users_schedule”中调用类函数“create_object_path”。
在同一个模块中,我有第二个类用于查看用户当前的日程安排:
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'
当我从“load_users_schedule”中删除“create_object_path”并独立运行它们时,代码可以正常工作。如上所示,我正在寻找一种能够将函数相互嵌入的方法,或者解释为什么我不应该这样做。
编辑:
对 ViewSchedule 的调用如下所示
ViewSchedule(ScheduleDataService).view_day(day_to_see, active_user)
【问题讨论】:
-
您能补充一下您是如何创建
ViewSchedule的对象的吗?另外,您为什么要使用 dunder 变量__schedule_data_service? -
调用
self.__schedule_data_service.load_users_schedule(self, active_user)- 您无需传递self。一般来说,你几乎不需要通过self -
@DeveshKumarSingh 我已经添加了对 ViewSchedule 的调用,该调用发生在触发错误的程序的主要流程中。我将它列为一个 dunder 变量,因为我希望它被视为私有的,不是一个可以玩的区域。
-
您应该注意使用 dunder 变量对名称进行修改,而不是使用单个下划线
-
另外你为什么不使用
ScheduleDataService的实例来传递给ViewSchedule构造函数?本质上是ViewSchedule(ScheduleDataService()).view_day(day_to_see, active_user)