参数的python类继承
我正在尝试用python创建一个schedule类,它获取会议的开始时间、结束时间和地点。到目前为止,我已经:参数的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)
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
,等等。Python不是Java,在Java中,您必须使用不同的名称,或者总是将类版本称为hr
。在Python中,您总是使用this.
。Python也有关键字参数,所以您可以使用<代码>时间(hr=4,…);self.
会很难看时间(init_hr=4,…)
- 如果您在Python 2中,请将
更改为print(…)
。如果您在Python 3中,请将其更改为print…
print(…)
时间
对象,并简单地测试它是否具有您想要的属性,而不是使用isinstance
。这样,将来有人(包括您)可以使用适当的属性创建您自己的时间
对象(hr
,min
,ampm
)并将其用作替代品。如果您不使用时间
对象执行实质性逻辑,或者不使用运算符与该逻辑交互,甚至可以使用它们自己的自定义对象,而这些自定义对象不使用相同的字段。这将有一些很好的优势,具体取决于您的日程对象的工作方式
这种类型的编码称为“”,由于广泛使用了
与使用isinstance相比,使用isinstance更好的模式(如果您想检查它是否符合标准)可能是使用hasattr
。例如:
hasattr(开始时间,'ampm')
我也同意其他人的观点,一个
时间表
似乎与时间
没有关系,而是一个有关系的时间表,否则你可能最终会有人创建一个时间表,以时间表
作为开始时间,以时间表
作为结束时间。而不是创造你自己的时间ass,尝试使用datetime
模块中的类。以及您定义的“计划”实际上只是一个事件或会议或约会,其中一个日程表包含许多。你确定你的日程表
课程是一种时间
?如果是这样,为什么需要创建两次?它们可能是完全不同的类型,但日程表
有一些>时间
objects作为其设计的一部分?将类时间表(Time)更改为(object)可以满足我的需求,但我从未见过它被使用。出于好奇,(object)到底有什么不同之处?@Flames1991在python中(
assert isinstance(start_time, Time)