Python模块中的属性

2024-03-29 02:27:08 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个处理基本几何特征的模块,比如角度和规则多边形。给我带来问题的部分是:

# 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不能按预期工作,解决方法是什么

编辑: 建议的重复问题建议使用class classobject(object):...,但随后继续在另一个类内定义@classobject属性,而不是在类外,并且不建议替换.setter


Tags: selfformatreturnif属性valuemodedef