Python 类的参数继承

0 投票
6 回答
3145 浏览
提问于 2025-04-17 07:31

我正在尝试在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库非常好用,但你也可以看看其他的测试工具,比如nosepytest)。

关于ScheduleTime的子类这件事,我同意其他人的看法。

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(...)

撰写回答