繁体   English   中英

参数的python类继承

[英]python class inheritance for parameters

我正在尝试在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)

我完成了一个Time类,看起来像这样:

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(从调度的初始化开始)设置为Time实例,但是我对如何执行此操作感到困惑。 有什么建议么?

您可能不希望Schedule是Time的子类。 两者之间的关系很可能是“具有”而不是“是”。 只要使其成为object的子类,就可以了。

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

但是,您可以:

  • 记录下来,以明确参数的预期类型(为此,我建议使用sphinx )。
  • 编写断言以确保传递的类型符合您的期望( assert isinstance(variable, type) )。 您甚至可以为pycontracts使用一些更高级的库。
  • 编写unittests还可以确保整个API都能按预期工作,也就是说,仅接受预期的类型( unittest库的效果很好,但是您可能要看一下鼻子pytest之类的替代运行器 )。

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

某些动态类型的语言希望您在任何地方都可以执行此操作(静态类型的语言通常会自己执行),但是在Python中,通常建议的做法是鸭子类型 ,这表明您只是希望它是一个Time,但是如果它是别担心,别担心(如果它实现与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(...)

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

由于在Python中,无法在编译时检查类型,因此您需要在Schedule的__init__上编写类似的内容

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

要么

assert isinstance(start_time, Time)

同样对于end_time

通常,Python的最佳实践是将其视为Time对象,并简单地测试它是否具有所需的属性,而不是使用isinstance 这样,某个人(包括您)将来可以使用适当的属性( hrminampm )创建自己的类似Time的对象,并将其用作替代对象。 如果您不对Time对象进行实质性逻辑处理,或者不使用运算符与该逻辑进行交互,那么使用自己的不使用相同字段的自定义对象甚至可以做到这一点。 这将具有一些良好的优势,具体取决于您的计划对象如何工作。

这种编码风格被称为“ 比许可更容易请求宽恕 ”,并且由于广泛使用鸭子类型 ,在python中相对常见。

比使用isinstance更好的模式(仍然允许您检查它是否符合标准)(如果要这样做)可能是使用hasattr 例如:

hasattr(start_time, 'ampm')

我也将与其他同意, Schedule似乎并不具有关系Time而是关系,否则你可以用有人用创建时间表结束Schedule的开始时间和Schedule作为结束时间。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM