如何在类内的创建和更改时间上将类属性与同一实例中的另一个属性值进行比较



在一个时间段内,起点必须小于终点。(2000年<2020年(

我的目标是一个 python 类,它在创建时或更改一个值以测试它们是否合理时比较这两个值。但这应该在课堂上进行

我尝试了不同变体的类似内容 - 没有成功:

class Timeperiod:
def __init__(self, start, end):
self._start = start
self._end = end
@property
def start(self):
return self._start
@start.setter
def start(self, start):
# if start > self._end: ### <- How to reach the 'self._end' value from here?
#     print ('ERROR')   ### <- to throw an error.
self._start = start
@property
def end(self):
return self._end
@end.setter
def end(self, end):
# if end < self._start:
#     print ('ERROR')
self._end = end
tp = Timeperiod(2000, 2020)
print (tp.start, '<', tp.end,': ',tp.start < tp.end) ### <- Test outside the class
tp.start = 2050
print (tp.start, '<', tp.end,': ',tp.start < tp.end)

我可以轻松地在类外测试值,但是如何在类比较它们呢?

据我所知,像"__gt__"这样的方法比较不同实例的值,对我来说,它们似乎不适合这种情况。我一直专注于 setter 方法,但在我所有的尝试中,我几乎得到了所有可能的属性错误。

关键在哪里?

目前尚不清楚您的问题是什么。self._end正是您从start二传器内部访问终点的方式。但是,如果设置值会破坏不变self._start = self._end,则不应仅打印错误消息,而应引发异常。

但是,如果您遇到的问题是确保start < end__init__内部也是正确的,我会定义一个私有方法来验证此不变量。然后,它可以用于__init__以及两个二传手。

class Timeperiod:
def __init__(self, start, end):
self._assert_valid_range(start, end)
self.start = start
self.end = end
@staticmethod
def _assert_valid_range(start, end):
if start >= end:
raise ValueError(f"Attempt to use start ({start}) >= end ({end})")
@property
def start(self):
return self._start
@start.setter
def start(self, start):
self._assert_valid_range(start, self._end)
self._start = start
@property
def end(self):
return self._end
@end.setter
def end(self, end):
self._assert_valid_range(self._start, end)
self._end = end

解决方案:您可能正在使用python 2.7。在那个版本的 python 中运行你的代码,它和你说的一样发生。

但是当使用 python 3.7 运行相同的脚本时,它可以正常工作。因此,解决方案很简单:

升级你的 python 解释器。无论如何,Python 2 不再被强制使用。

希望我能帮上忙

最新更新