getter return 的值与 setter 设置的值不同是否可取?
Is it advisable to have a getter that return a different value than that set by the setter?
我觉得这对我的目的来说是实用的,但也有点令人困惑,因为人们可能希望获得与输入相同的输出。
@property
def value(self):
return next(
(option.key for option in self._options
if option.id == self._value),
None)
@value.setter
def value(self, value):
idoption = None
if isinstance(value, Option):
idoption = next(
(option.id for option in self._options
if option.id == value.id), None)
elif isinstance(value, int):
idoption = next(
itertools.chain(
(option.id for option in self._options
if option.key == value),
(option.id for option in self._options
if option.id == value)
), None)
elif isinstance(value, str):
idoption = next(
(option.id for option in self._options
if option.key == value), None)
if idoption:
super()._set_value(idoption)
else:
raise InvalidOptionError(entity=self.entity_name,
field=self.name,
value=value)
当运行:
company.value = 123
print(company.value) # returns company_1
如果您的 setter 和 getter 正在执行重要的工作,那么它们实际上不再是 setter 或 getter。尽管代码是正确的,但我会建议重命名(一个或两个)函数,以便在使用它们时清楚它们不是简单的 getter 和 setter。类似于:
company.set_value_option_record(123)
print(company.extract_value())
除非你出于某种原因绝对需要使用 @property
和 @value.setter
装饰器。在这种情况下,请务必为 class.
的用户明确记录它
我觉得这对我的目的来说是实用的,但也有点令人困惑,因为人们可能希望获得与输入相同的输出。
@property
def value(self):
return next(
(option.key for option in self._options
if option.id == self._value),
None)
@value.setter
def value(self, value):
idoption = None
if isinstance(value, Option):
idoption = next(
(option.id for option in self._options
if option.id == value.id), None)
elif isinstance(value, int):
idoption = next(
itertools.chain(
(option.id for option in self._options
if option.key == value),
(option.id for option in self._options
if option.id == value)
), None)
elif isinstance(value, str):
idoption = next(
(option.id for option in self._options
if option.key == value), None)
if idoption:
super()._set_value(idoption)
else:
raise InvalidOptionError(entity=self.entity_name,
field=self.name,
value=value)
当运行:
company.value = 123
print(company.value) # returns company_1
如果您的 setter 和 getter 正在执行重要的工作,那么它们实际上不再是 setter 或 getter。尽管代码是正确的,但我会建议重命名(一个或两个)函数,以便在使用它们时清楚它们不是简单的 getter 和 setter。类似于:
company.set_value_option_record(123)
print(company.extract_value())
除非你出于某种原因绝对需要使用 @property
和 @value.setter
装饰器。在这种情况下,请务必为 class.