Skip to main content
 首页 » 编程设计

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

2025年05月04日60lexus

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

Circle 是一个有两个变量的类,self.radius 和 self.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)