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
现在我想让日程类中的开始时间和结束时间这两个参数(在初始化日程时传入的)变成时间类的实例,但我对怎么实现这一点感到困惑。有没有什么建议?
6 个回答
2
其实你不需要对你的代码做什么大的改动。
不过,你可以考虑以下几点:
- 给代码加上注释,说明参数应该是什么类型(我推荐使用sphinx来做这个)。
- 写一些检查代码,确保传入的类型符合你的预期(可以用
assert isinstance(variable, type)
来检查)。你还可以使用一些更高级的库,比如pycontracts。 - 写单元测试,确保整个API按预期工作,也就是说,只接受你期望的类型(unittest库非常好用,但你也可以看看其他的测试工具,比如nose或pytest)。
关于Schedule
是Time
的子类这件事,我同意其他人的看法。
2
你可能不想让 Schedule 成为 Time 的子类,因为它们之间的关系更像是“拥有一个”而不是“是一种”。所以直接让它成为 object
的子类就可以了,这样就没问题了。
4
一些动态类型的编程语言希望你在代码中到处使用类型检查(而静态类型的语言通常会自己强制执行这一点),但在Python中,通常推荐的做法是鸭子类型。这意味着你可以假设某个对象是一个时间类型(Time),但如果它不是,也没关系(只要它实现了和时间类型相同的接口,那就很好;如果没有,那就等你尝试访问不存在的属性时再出错)。总的来说,这里传达的意思是,你应该有足够的智慧知道自己在做什么。
如果我是写这段代码的人,我会保持你现在的写法,但加上几点说明:
- 正如其他人提到的,把
class Schedule(Time)
改成class Schedule(object)
。 - 在
Time.__init__
中,不要把参数命名为init_hr
等等,直接用hr
等等就可以。Python和Java不一样,Java需要用不同的名字,或者总是用this.*
来引用类的属性。在Python中,你总是使用self.*
。Python还有关键字参数,所以你可以写成Time(hr=4, ...)
;如果写成Time(init_hr=4, ...)
就显得很别扭。 - 如果你在用Python 2,把
print (...)
改成print ...
。如果你在用Python 3,就改成print(...)
。