如何在 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