我正在尝试实现代表(几何)圆并可以打印自己的数据的类的最简单示例。
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)
关于python - 具有两个 "synchronized"变量的类的最短示例,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40326668/