代码之家  ›  专栏  ›  技术社区  ›  Dinko Pehar

在uuu init中应用属性设置程序逻辑__

  •  1
  • Dinko Pehar  · 技术社区  · 7 年前

    我读到这个 answer 在python中设置属性并获取 最大递归深度错误 .

    在设置属性时,应该如何在何处检查和测试值?我知道我可以办理登机手续 setter ,但是登记好了吗 __init__() 一个班的?如果我登记的话 γ-iITI^() ,然后是我的 设定器 和 __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))
    
    1 回复  |  直到 7 年前
        1
  •  2
  •   timgeb    7 年前

    你可以简单地发出 self.real = real 在里面 __init__ . 属性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