我正在学习设计真实世界的OOP问题的方法,我试图用面向对象的方法来解决这个问题。问题陈述如下:
在Python45minLua中对企业Rails进行测试输入快速测试--在Python45minLua中,大量使用Gem版本的30分钟Ruby错误,45分钟通用Ruby错误,45 my,Python开发人员闪电通信,60分钟会计驱动的开发45分钟,Woah 30分钟,坐下来写30分钟对程序和噪音45分钟Rails魔术60分钟Ruby on Rails:为什么我们要在西雅图30分钟Boondocks的Boondocks(我的项目中)编写45分钟的Ruby程序,与Ruby开发30分钟Rails应用程序维护60分钟,一个没有HackerNews 30分钟用户界面的世界,在Rails 30分钟测试输出轨道1: 09::00AM编写针对企业Rails的快速测试60分钟10:00AM远程通信60分钟11:00 Rails魔术60分钟12:00 Gem午餐01:00 Gem on Rails:为什么我们应该继续60分钟02:00 Gem常见Ruby错误45min 02:45 Gem公共Ruby错误45min 02:45 Gem会计驱动开发45min 03:30 Gem编程与噪音45min 04:15 Gem用户界面CSS在Rails应用程序中30 Gem 04:45 Gem用于Python开发者闪电04:50PM网络事件轨道2: 09:00AM Ruby On Rails维护60min 10:00AM在Python 45min 10:45AM Ruby错误来自错误匹配的Gem 45min 11:30AM Lua Lua对于大众来说,30分钟12:00的午餐01:00下午10:00(在我的项目上)45分钟01:45 04 30分钟02:15下午坐下来写30min 02:45下午编程在西雅图的Boondocks 30min 03:15 04 Ruby for后端开发30分钟03:45PM一个没有HackerNews 30min 04:15的网络事件
我成功地完成了问题的设计,它工作得很完美,但我希望看到专家对我的代码的意见,并提供建议。
from datetime import timedelta, datetime
class Timing:
def __init__(self):
self.morning_start = (datetime.min+ timedelta(hours=9)).strftime('%I:%M %p')
self.lunch = (datetime.min+ timedelta(hours=12)).strftime('%I:%M %p')
self.afternoon_start = (datetime.min+ timedelta(hours=13)).strftime('%I:%M %p')
self.day_end = (datetime.min+ timedelta(hours=17)).strftime('%I:%M %p')
if __name__ == '__main__':
a = Timing()
print(a.afternoon_start)from datetime import timedelta, datetime
from .timing import Timing
class Track(Timing):
id = 0
def __init__(self):
super(Track, self).__init__()
Track.id += 1
self.talks = {}
self.talk_list = Track.extract_input()
@staticmethod
def extract_input():
__talks = {}
lines = []
try:
lines = [line.strip() for line in open('test.txt')]
except FileNotFoundError as e:
print('File Not Found', e)
for line in lines:
title, minutes = line.rsplit(maxsplit=1)
try:
minutes = int(minutes[:-3])
# negative indexing raises error, so it means it's lightning
except ValueError:
minutes = 5
__talks[line] = minutes
return __talks
def get_talks(self, start_talk, end_talk):
start = timedelta(hours=start_talk)
for key, value in list(self.talk_list.items()):
prev = start + timedelta(minutes=int(value))
if prev <= timedelta(hours=end_talk):
self.talks[(datetime.min + start).strftime('%I:%M %p')] = key
self.talk_list.popitem()
start += timedelta(minutes=int(value))
return self.talks
def show_output(self):
while not len(self.talk_list) is 0:
print('Track %s' % Track.id)
self.__prepare_output(9, 12)
print('%s - %s' % (self.lunch, 'Lunch'))
self.__prepare_output(13, 17)
print('%s - %s' % (self.day_end, 'Networking Event'))
Track.id += 1
def __prepare_output(self, start, end):
for time, title in sorted(self.get_talks(start, end).items()):
print(time, '-', title)
# clear previous entries
self.talks.clear()
if __name__ == '__main__':
a = Track()
a.show_output()发布于 2015-07-07 20:01:44
以下是一些一般性意见:
test.txt,但永远不要再次关闭它。你正在创建一个包含所有行的列表,这对内存来说效率很低。最好是一次只遍历一行,如下所示:使用open('test.txt')作为f: for行f:# do整行返回__talks -这是更有效的内存和惯用用法。talks变量上加上两个下划线;我认为它看起来很奇怪,并且会去掉它。get_talks()中,您将self.talk_list.items()的结果转换为一个列表,我不知道为什么要这样做。可以直接在.items()上迭代,而不必首先将其转换为列表。同样,我们知道这些值是int的,因为我们在extract_input()中将它们设置为int‘s。因此,强制转换到int()只是多余的。key, value上迭代,我选择的变量名称反映了字典中这些元素的含义。Self.talk_list.items()中的几分钟谈话如何:这将使您更容易遵循代码的意图。show_output()中,if语句有点奇怪。我认为您想说的是“如果self.talk_list中还有元素,请继续”,这更好地表示为self.talk_list:我认为这更容易阅读。发布于 2015-07-07 18:25:04
首先,负索引在Python中确实有效,所以下面的except块永远不会执行。另外,当您尝试访问不存在的list元素时,它会引发IndexError,而不是ValueError。
try:
minutes = int(minutes[:-3])
# negative indexing raises error, so it means it's lightning
except ValueError:
minutes = 5为什么方法__talks中的变量extract_input以两个前导下划线为前缀?变量是函数的本地变量,因此不需要将其设置为“私有”。
最后,添加一些文档字符串来描述您的函数/类。Docstring是用来描述函数的特殊注释。一个示例docstring如下所示:
def my_func( ... ):
"""
Describe what your function does
in addition to it's arguments.
"""
...https://codereview.stackexchange.com/questions/83193
复制相似问题