[英]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
的子类,就可以了。
某些动态类型的语言希望您在任何地方都可以执行此操作(静态类型的语言通常会自己执行),但是在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, ...)
很难看。 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
。 这样,某个人(包括您)将来可以使用适当的属性( hr
, min
, ampm
)创建自己的类似Time
的对象,并将其用作替代对象。 如果您不对Time
对象进行实质性逻辑处理,或者不使用运算符与该逻辑进行交互,那么使用自己的不使用相同字段的自定义对象甚至可以做到这一点。 这将具有一些良好的优势,具体取决于您的计划对象如何工作。
这种编码风格被称为“ 比许可更容易请求宽恕 ”,并且由于广泛使用鸭子类型 ,在python中相对常见。
比使用isinstance
更好的模式(仍然允许您检查它是否符合标准)(如果要这样做)可能是使用hasattr
。 例如:
hasattr(start_time, 'ampm')
我也将与其他同意, Schedule
似乎并不具有与关系Time
而是有关系,否则你可以用有人用创建时间表结束Schedule
的开始时间和Schedule
作为结束时间。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.