Свойства в модулях Python - PullRequest
0 голосов
/ 17 мая 2019

У меня есть модуль для обработки основных геометрических объектов, таких как углы и правильные многоугольники. Часть, которая вызывает у меня проблемы, находится здесь:

# 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.

...