在 __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
我通过在 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