Благодаря Адаму Хьюзу и Уоррену Векессеру из списка рассылки Enthought я понял, чего мне не хватало в моем понимании.
Свойства на самом деле не существуют как атрибут. Теперь я рассматриваю их как нечто вроде «виртуального» атрибута, который полностью зависит от того, что делает писатель класса во время вызова _getter или _setter.
Поэтому, когда я хотел бы иметь возможность установить длину волны и частоту для пользователя, мне нужно только понять, что сама частота не существует в качестве атрибута и что вместо этого во время установки частоты мне нужно обновить «фундаментальную» 'атрибут длины волны, так что в следующий раз, когда требуется частота, она рассчитывается снова с новой длиной волны!
Мне также нужно поблагодарить пользователя sr2222, который заставил меня задуматься об отсутствующем кэшировании. Я понял, что зависимости, которые я установил с помощью ключевого слова 'depen_on', требуются только при использовании черты 'cached_property'. Если затраты на вычисление не так высоки или они выполняются не так часто, _getters и _setters позаботятся обо всем, что нужно, и не нужно использовать ключевое слово зависимость_ *. 1005 *
Вот теперь упорядоченное решение, которое я искал, которое позволяет мне устанавливать длину волны или частоту без круговых петель:
class Photon(HasTraits):
wavelength = Float
frequency = Property
energy = Property
def _wavelength_default(self):
return 1.0
def _get_frequency(self):
return c/self.wavelength
def _set_frequency(self, freq):
self.wavelength = c/freq
def _get_energy(self):
return h*self.frequency
Можно использовать этот класс так:
photon = Photon(wavelength = 1064)
или
photon = Photon(frequency = 300e6)
чтобы установить начальные значения и получить энергию сейчас, просто используйте ее напрямую:
print(photon.energy)
Обратите внимание, что метод _wavelength_default заботится о том случае, когда пользователь инициализирует экземпляр Photon без предоставления начального значения. Только для первого доступа к длине волны этот метод будет использоваться для его определения. Если бы я не сделал этого, первый доступ к частоте привел бы к вычислению 1/0.