2011-12-02 75 views
0

我想创建一个需要开始时间,结束时间和会议位置的Python时间表类。到目前为止,我有:Python参数类继承

class Schedule(Time): 
def __init__(self, start_time, end_time, location): 
    self.start_time = start_time 
    self.end_time = end_time 
    self.location = location 
    print (self.start_time) 
    print (self.end_time) 
    print (self.location) 

我有一个时间类完成的,看起来像这样:

class Time(): 
    def __init__(self, init_hr = 12, init_min = 0, init_ampm = "AM"): 
     self.hr = init_hr 
     self.min = init_min 
     self.ampm = init_ampm 

现在我希望能够使参数START_TIME和END_TIME(从时间表的初始化)成为时间实例,但我很困惑我会如何去做这件事。有什么建议么?

+1

不要发明自己的Time类,而是尝试使用'datetime'模块中的类。 – PaulMcG

+0

您定义为“Schedule”的内容实际上只是一个Event或Meeting或Appointment,其中一个Schedule会包含很多内容。 – PaulMcG

+0

你确定*你的'Schedule'类**是一种**时间类吗?如果是这样,那么它需要两次创建?相反,它们可能是完全不同的东西,但是'Schedule' **作为其设计的一部分有一些** Time'对象? – SingleNegationElimination

回答

2

一些动态类型语言会希望你在任何地方都这样做(静态类型语言通常会自己执行它),但是在Python一般推荐的做法是duck typing,这表明你只是期望它是一个时间,但如果它是别的东西,别担心(如果它实现与Time相同的接口,那么好,如果不是,当您尝试访问对象上不存在的属性时,让它失败)。总的想法是,你期望你足够聪明,知道你在做什么。

如果我写了这段代码,我会离开它,因为你拥有它,有几点注意事项:

  • 正如其他人所说,改变class Schedule(Time)class Schedule(object)
  • Time.__init__中,请不要调用您的参数init_hr等,只需将它们称为hr等。Python不是Java,您必须使用不同的名称或始终将类版本称为this.*。在Python中,你总是使用使用self.*。 Python也有关键字参数 - 所以你可以有Time(hr=4, ...); Time(init_hr=4, ...)将是丑陋的。
  • 如果您使用的是Python 2,请将print (...)更改为print ...。如果您使用的是Python 3,请将其更改为print(...)
+0

更改班时间表(时间)为(对象)给了我我在找什么,但是我从未见过使用过。出于好奇,究竟(对象)究竟有什么不同? – me45

+0

@ Flames1991在Python(<2.2)中没有使用对象,并且类的实现与当前的不同。当新样式类可用时,需要明确从对象中继承类,以清楚地表明使用了新样式类(并且不会破坏旧代码)。你可以在这里找到更多的信息(http://stackoverflow.com/q/54867/183066)。 – jcollado

2

您可能不希望Schedule作为Time的子类;两者之间的关系最有可能是“有一个”而不是“是一个”。只要把它做成object的一个子类,你应该没问题。

1

你会说“时间表是时间”吗?我不会。这意味着它们不会以这种方式继承。我会说一个时间表是一个时间的集合,这意味着你的时间表类将有一个属性,这是一个时间列表。

2

您并不需要更改代码中的任何内容。

但是,您可以:

  • 文件就可以讲清楚的参数的预期类型(我建议sphinx为)。
  • 编写断言以确保传递的类型符合您的期望(assert isinstance(variable, type))。您甚至可以使用更多高级库,例如pycontracts
  • 也写单元测试,以确保整个API按预期工作,也就是说,只有预期的类型被接受(unittest图书馆很好,但你可能想看看替代跑步者如nosepytest)。

关于ScheduleTime的一个子类,我同意其他答案。

0

因为在Python中,类型不能在编译时检查你需要写像这样的附表__init__

if not isinstance(start_time, Time): 
    raise ValueError("Start time need to be of type time") 

assert isinstance(start_time, Time) 

同样,对于end_time

0

在Python通常最好的做法是把它当作如果它是一个Time对象,简单地测试它是否有你想要,而不是使用isinstance属性。这样,某人(包括你)可以在将来创建属于自己的类似Time的对象,并具有适当的属性(hr,min,ampm),并将其用作插入式替代品。这甚至会起作用 - 如果你没有用Time对象做实体逻辑,或者使用操作符与那个逻辑进行交互 - 用他们自己的不使用相同字段的自定义对象。这将有一些好处,具体取决于您的日程安排对象的工作方式。

这种编码方式被称为“Easier to ask for forgiveness than permission”,由于广泛使用了duck typing,它在python中比较常见。

比使用isinstance还好,可以检查它是否符合标准(如果要这样做)的模式可能会改为使用hasattr。例如:

hasattr(start_time, 'ampm')

我也会与其他同意,Schedule似乎并不具有Time一个关系,而是一个关系,否则你可能最终与某人创建一个时间表,其中Schedule作为开始时间,Schedule作为结束时间。