在 __init__ 中应用 属性 setter 逻辑

Applying property setter logic in __init__

我通过在 python 中设置属性并获得 最大递归深度错误 .

来阅读此 answer

在设置属性时,我应该如何以及在何处检查和测试值?我知道我可以在 setter 中检查它,但是在 class 的 __init__() 中检查它好吗?如果我在 __init__() 中检查它,那么我的 setter__init__ 有重复代码。

我的代码示例:

class RealNumber:

    def __init__(self, real):
        self._real = real  # NEED TO TEST IT BEFORE ASSIGNMENT
                           # TEST IS SAME AS IN SETTER

    @property
    def real(self):
        return self._real

    @real.setter
    def real(self, value):
        if isinstance(value, int):
            self._real = value
        else:
            raise ValueError('Can not set real part with value {}'.format(value))

您可以简单地在 __init__ 中发出 self.real = real。 属性setter已经生效

class RealNumber:
    def __init__(self, real):
        self.real = real

    @property
    def real(self):
        return self._real

    @real.setter
    def real(self, value):
        if isinstance(value, int):
            self._real = value
        else:
            raise ValueError('Can not set real part with value {}'.format(value))


r = RealNumber(3)
print(r._real)
print(r.real)
print(vars(r))

try:
    RealNumber('bogus')
except ValueError:
    print('error as expected')

输出:

3
3
{'_real': 3}
error as expected