【发布时间】:2020-09-25 10:05:38
【问题描述】:
我有一个带有属性的类(在下面的玩具示例中为signature)。
必须进行一些验证,因此有一个 setter (@signature.setter)。
class Signature:
def __init__(self, input_array):
self.signature = input_array
@property
def signature(self):
return self._signature
@signature.setter
def signature(self, input_array):
arr = np.array(input_array)
if arr.ndim > 1:
raise ValueError("Only one-dimensional arrays are accepted!")
arr = np.unique(arr)
if any(arr <= 0):
raise ValueError("Only positive numbers are accepted!")
self._signature = arr
lst = [2,3,4]
s = Signature(lst)
s.signature
# array([2, 3, 4])
但是我可以写:
s.signature = [4, 5, 6]
一切都会很好,因为有一个@signature.setter。
现在我想要保护 s.signature 在创建此具体对象后不被设置。
我应该在__new__ 中使用@property 吗?我该怎么做?
(我知道How to restrict setting an attribute outside of constructor? 的讨论,但那里没有二传手……)
【问题讨论】:
-
不使用setter,为什么不移除setter,只在init期间设置_signature?否则,您可以在设置器中执行
if not self._signature以仅在尚未定义的情况下更改 _signature -
如果您希望只通过
__init__设置self.signature,为什么首先要有一个公共设置器? -
嗯...这很明显。现在我很难理解为什么这对我来说是个问题。抱歉打扰各位了……