我正在尝试实现一个代表(几何)圆的类的最简单的例子,并且可以打印自己的数据.
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)
Run Code Online (Sandbox Code Playgroud)
我很好奇是否有办法在更少的代码行中完成同样的事情,或者这是否是最好的.
一种更简单的方法是仅使用类中的单个属性,并通过从第一个请求计算第二个属性来提供第二个属性.
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)
| 归档时间: |
|
| 查看次数: |
46 次 |
| 最近记录: |