参数的python类继承

参数的python类继承,python,inheritance,parameters,init,Python,Inheritance,Parameters,Init,我正在尝试用python创建一个schedule类,它获取会议的开始时间、结束时间和地点。到目前为止,我已经: 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)

我正在尝试用python创建一个schedule类,它获取会议的开始时间、结束时间和地点。到目前为止,我已经:

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(从计划的初始化开始)设置为时间实例,但是我不知道该如何做。有什么建议吗?

你可能不希望时间表成为时间的一个子类;两者之间的关系很可能是“有”而不是“是”。只要把它变成
对象的一个子类
就可以了。

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

您实际上不需要更改代码中的任何内容

但是,您可以:

  • 将其记录下来,以明确参数的预期类型(我建议这样做)
  • 编写断言以确保传递的类型符合您的期望(
    assert-isinstance(variable,type)
    )。您甚至可以使用一些更高级的库来实现这一点
  • 还要编写单元测试,以确保整个API按预期工作,也就是说,只接受预期的类型(库工作得很好,但您可能希望查看其他运行程序,如或)

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

因为在Python中,不能在编译时检查类型,所以需要在Schedule的
\uuu init\uuu
上编写类似的内容

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


类似地,对于
结束时间

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

如果我在写这段代码,我会让它保持原样,并附上一些注释:

  • 正如其他人所提到的,将
    课程计划(时间)
    更改为
    课程计划(对象)
  • Time.\uuuu init\uuuu
    中,不要调用参数
    init\u hr
    ,等等,只需调用它们
    hr
    ,等等。Python不是Java,在Java中,您必须使用不同的名称,或者总是将类版本称为
    this.
    。在Python中,您总是使用
    self.
    。Python也有关键字参数,所以您可以使用<代码>时间(hr=4,…);
    时间(init_hr=4,…)
    会很难看
  • 如果您在Python 2中,请将
    print(…)
    更改为
    print…
    。如果您在Python 3中,请将其更改为
    print(…)

一般来说,Python的最佳实践是将其视为一个
时间
对象,并简单地测试它是否具有您想要的属性,而不是使用
isinstance
。这样,将来有人(包括您)可以使用适当的属性创建您自己的
时间
对象(
hr
min
ampm
)并将其用作替代品。如果您不使用
时间
对象执行实质性逻辑,或者不使用运算符与该逻辑交互,甚至可以使用它们自己的自定义对象,而这些自定义对象不使用相同的字段。这将有一些很好的优势,具体取决于您的日程对象的工作方式

这种类型的编码称为“”,由于广泛使用了

与使用isinstance相比,使用isinstance更好的模式(如果您想检查它是否符合标准)可能是使用
hasattr
。例如:


hasattr(开始时间,'ampm')


我也同意其他人的观点,一个
时间表
似乎与
时间
没有关系,而是一个有关系的时间表,否则你可能最终会有人创建一个时间表,以
时间表
作为开始时间,以
时间表
作为结束时间。

而不是创造你自己的时间ass,尝试使用
datetime
模块中的类。以及您定义的“计划”实际上只是一个事件或会议或约会,其中一个日程表包含许多。你确定你的
日程表
课程是一种
时间
?如果是这样,为什么需要创建两次?它们可能是完全不同的类型,但
日程表
有一些
>时间
objects作为其设计的一部分?将类时间表(Time)更改为(object)可以满足我的需求,但我从未见过它被使用。出于好奇,(object)到底有什么不同之处?@Flames1991在python中(
assert isinstance(start_time, Time)