I have a module for handling basic geometry features like angles and regular polygons. The portion that's giving me issues is here:
# 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)
The issue I'm having is related to the angle_mode property.
At the interpreter, I expect the following to happen:
# 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))
Instead, a and b both return their values as degrees before and after geometry.angle_mode = 'r'. It works correctly if I set geometry._angle_mode directly, but I would like to get/set it through a property so that I can enforce the modes.
Why are the property and .setter not working as expected, and what's the fix?
EDIT:
The suggested duplicate question suggests class classobject(object):... but then proceeds to define the @classobject property inside another class, not outside the class and doesn't suggest a replacement for .setter.
