python - 具有两个 "synchronized"变量的类的最短示例

标签 python python-3.x

我正在尝试实现代表(几何)圆并可以打印自己的数据的类的最简单示例。

Circle 是一个有两个变量的类,self.radiusself.area。唯一的要求是,当改变一个变量时,另一个变量也随之改变。

最简单的方法是什么?是否与 property 装饰器一起使用?

这是我的尝试。

import math


class Circle:

    def __init__(self, radius=1):
        self._radius = radius
        self._area = math.pi * radius**2

    @property
    def radius(self):
        return self._radius

    @radius.setter
    def radius(self, radius):
        self._radius = radius
        self._area = math.pi * radius**2

    @property
    def area(self):
        return self._area

    @area.setter
    def area(self, area):
        self._area = area
        self._radius = math.sqrt(area / math.pi)

    def __repr__(self):
        return 'radius {:.2f}  area {:.2f}'.format(self._radius, self._area)


c = Circle()
print(c)

c.radius = 110
print(c)

c.area = 3
print(c)

我很好奇是否有一种方法可以用更少的代码行完成同样的事情,或者这是否是最好的方法。

最佳答案

一种更简单的方法是只在类中使用单个属性,并根据请求从第一个属性计算它来提供第二个属性。

import math

class Circle:
    def __init__(self, radius=1):
        self.radius = radius

    @property
    def area(self):
        return math.pi * self.radius**2

    @area.setter
    def area(self, area):
        self.radius = math.sqrt(area / math.pi)

    def __repr__(self):
        return 'radius {:.2f}  area {:.2f}'.format(self.radius, self.area)


c = Circle()
print(c)

c.radius = 110
print(c)

c.area = 3
print(c)

此外,如果以少行代码为目标,我们可以缩短area属性代码位,修改代码如下:

import math

class Circle:
    def __init__(self, radius=1):
        self.radius = radius

    area = property(fget=lambda s: math.pi * s.radius ** 2,
                    fset=lambda s, area: s.radius = math.sqrt(area / math.pi))

    def __repr__(self):
        return 'radius {:.2f}  area {:.2f}'.format(self.radius, self.area)


c = Circle()
print(c)

c.radius = 110
print(c)

c.area = 3
print(c)

关于python - 具有两个 "synchronized"变量的类的最短示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40326668/

相关文章:

python - 我如何调试 PyDev 自动完成服务器来弄清楚为什么它不能分析模块?

python - 如何在python中左连接2个数据帧,如果过滤后第二个数据帧中有多个匹配行,则与第一行连接

python - ete2如果一个节点是一对坐标怎么操作

python - 在Python中匹配二维数组中的一维数组

python - 使用 list.count 搜索列表中的多个项目?

python - “Class” 与 “namedtuple” 在 Python 中模拟牌组

Python正则表达式与文件扩展名匹配

python - 比较两个文件中的 x、y、z 坐标

python - 在不保留旧父类的情况下用另一个类替换父类

python - 重复 Dialogflow 意图直到满足条件