如何在 class 中的创建和更改时间比较 class 属性与同一实例中的另一个属性值
how to compare a class attribute with another attribute value in the same instance on creation and changing time inside the class
在一个时间段内,起点必须小于终点。 (2000 < 2020)
我的目标是 python class 比较这两个值的创建时间或每当更改一个值以测试它们是否合理。但这应该发生在 inside the class.
我尝试过类似的不同变体 - 但没有成功:
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)
我可以轻松测试 class 之外的值,但是如何比较 内部 class?
据我所知,“__gt__”之类的方法比较不同实例的值,对我来说它们似乎不适合这种情况。我一直专注于 setter 方法,但在我所有的尝试中,我几乎遇到了所有可能的属性错误。
钥匙在哪里?
解决方案:您可能正在使用 python 2.7。在 运行 你的代码在那个版本的 python 中,它发生的和你说的一样。
但是当 运行使用 python 3.7 使用相同的脚本时,它工作得很好。所以,解决方法很简单:
升级您的 python 解释器。 Python 2 无论如何都不再被维护了。
希望能帮到你
不清楚你的问题是什么。 self._end
正是您从 start
setter 内部访问终点的方式。但是,如果设置值会破坏不变量 self._start = self._end
.
,则不应仅打印错误消息,而应引发异常
但是,如果您遇到的问题是确保 start < end
在 __init__
中也为真,我会定义一个私有方法来验证此不变量。然后它可以在 __init__
以及 setter 中使用。
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
在一个时间段内,起点必须小于终点。 (2000 < 2020)
我的目标是 python class 比较这两个值的创建时间或每当更改一个值以测试它们是否合理。但这应该发生在 inside the class.
我尝试过类似的不同变体 - 但没有成功:
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)
我可以轻松测试 class 之外的值,但是如何比较 内部 class?
据我所知,“__gt__”之类的方法比较不同实例的值,对我来说它们似乎不适合这种情况。我一直专注于 setter 方法,但在我所有的尝试中,我几乎遇到了所有可能的属性错误。
钥匙在哪里?
解决方案:您可能正在使用 python 2.7。在 运行 你的代码在那个版本的 python 中,它发生的和你说的一样。
但是当 运行使用 python 3.7 使用相同的脚本时,它工作得很好。所以,解决方法很简单:
升级您的 python 解释器。 Python 2 无论如何都不再被维护了。
希望能帮到你
不清楚你的问题是什么。 self._end
正是您从 start
setter 内部访问终点的方式。但是,如果设置值会破坏不变量 self._start = self._end
.
但是,如果您遇到的问题是确保 start < end
在 __init__
中也为真,我会定义一个私有方法来验证此不变量。然后它可以在 __init__
以及 setter 中使用。
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