我认为这对我的目的来说是实用的,但也有点令人困惑,因为人们可能期望获得与输入相同的输出。
@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
答案 0 :(得分:6)
如果你的制定者和吸气者正在进行重要的工作,他们真的不再是制定者或吸气者。虽然代码是正确的,但我建议重命名(一个或两个)函数,以便在使用它们时它们不是简单的getter和setter。类似的东西:
company.set_value_option_record(123)
print(company.extract_value())
除非您出于某种原因绝对需要使用@property
和@value.setter
装饰器。在这种情况下,请务必为您的班级用户明确记录。