具有两个"同步"变量的类的最短示例

éta*_*ogy 1 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)
Run Code Online (Sandbox Code Playgroud)

我很好奇是否有办法在更少的代码行中完成同样的事情,或者这是否是最好的.

Nir*_*Izr 5

一种更简单的方法是仅使用类中的单个属性,并通过从第一个请求计算第二个属性来提供第二个属性.

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)
Run Code Online (Sandbox Code Playgroud)

此外,如果目标是更少的代码行,我们可以缩短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)
Run Code Online (Sandbox Code Playgroud)