У меня есть модуль для обработки основных геометрических объектов, таких как углы и правильные многоугольники. Часть, которая вызывает у меня проблемы, находится здесь:
# geometry.py
_angle_mode = 'd'
@property
def angle_mode():
return _angle_mode
@angle_mode.setter
def angle_mode(value):
if value != 'd' or value != 'r':
raise ValueError("ValueError: invalid mode: '{0}'".format(mode))
_angle_mode = value
class angle:
def __init__(self, value, mode=None):
if mode is None:
mode = _angle_mode
if mode == 'd':
self.deg = value
self.rad = math.radians(value)
elif mode == 'r':
self.rad = value
self.deg = math.degrees(value)
else:
raise ValueError("ValueError: invalid mode: '{0}'".format(mode))
def __repr__(self):
if _angle_mode == 'd':
return 'angle({0}deg)'.format(self.deg)
elif _angle_mode == 'r':
print(7)
return 'angle({0}rad)'.format(self.rad)
Проблема, с которой я столкнулся, связана со свойством angle_mode
.
В переводчике я ожидаю, что произойдет следующее:
# interpreter
>>> import geometry
>>> a, b = geometry.angle(72), geometry.angle(2, 'r')
>>> a, b
(angle(72deg), angle(114.59...deg))
>>> geometry.angle_mode = 'r'
>>> a, b
(angle(1.25...rad), angle(2rad))
Вместо этого a и b оба возвращают свои значения в градусах до и после geometry.angle_mode = 'r'
. Он работает правильно, если я установил geometry._angle_mode
напрямую, но я хотел бы получить / установить его через свойство, чтобы я мог применять режимы.
Почему свойство и .setter не работают должным образом, и что за исправление?
EDIT:
Предложенный дублирующий вопрос предлагает class classobject(object):...
, но затем приступает к определению свойства @classobject внутри другого класса, а не за его пределами, и не предлагает замены для .setter.