python - 在 Python 类定义中放置多个带有 return 的函数是否正确?
问题描述
这是查找三角形面积的代码,其中我已经初始化了三角形的尺寸,def __init__
并且我还需要为这些初始尺寸初始化它的面积,为此我也放在self.a1
了def __init__
。函数def tarea()
将值返回到self.a1
函数中__init__
。另一个函数def getarea()
在类定义中,用于在设置三角形的尺寸时返回三角形的面积。只需要知道是否可以以更有效的方式执行此任务?在类定义中编写两个带有 return 的函数可以吗?
class triangle:
def __init__(self, sa1, sa2, sa3 ):
self.s1 = sa1
self.s2 = sa2
self.s3 = sa3
self.a1 = self.tarea()
def sets1(self, ss1):
self.s1 = ss1
def sets2(self, ss2):
self.s2 = ss2
def sets3(self, ss3):
self.s3 = ss3
def tarea(self):
a = (self.s1 + self.s2 +self.s3)/2
return (a*(a - self.s1)*(a-self.s2)*(a-self.s3))**0.5
def getarea(self):
self. a1 = self.tarea()
return self.a1
tri = triangle(3,4,5)
print("Area of triangle=", tri.a1)
tri.sets1(4)
tri.sets2(5)
tri.sets3(6)
print("Area of triangle with another values",f'{tri.getarea():.2f}')
解决方案
我会将区域定义为property
基于当前边计算区域的 a。
class Triangle:
def __init__(self, sa1, sa2, sa3 ):
self.s1 = sa1
self.s2 = sa2
self.s3 = sa3
@property
def area(self):
a = (self.s1 + self.s2 +self.s3)/2
return (a*(a - self.s1)*(a-self.s2)*(a-self.s3))**0.5
如果您认为在边没有改变的情况下按需计算该区域的成本很高,则可以缓存该区域。我们让每一边都成为一个属性,当一个边发生变化时,它可以使缓存失效。
样板繁重的版本:
class Triangle:
def __init__(self, sa1, sa2, sa3 ):
self._s1 = sa1
self._s2 = sa2
self._s3 = sa3
self._area = None
# We could also use the setters to set self.s1 = sa1,
# etc, and let them initialize self._area to None.
@property
def s1(self):
return self._s1
@s1.setter
def s1(self, value):
self._s1 = value
self._area = None
@property
def s2(self):
return self._s2
@s2.setter
def s2(self, value):
self._s2 = value
self._area = None
@property
def s3(self):
return self._s3
@s3.setter
def s3(self, value):
self._s3 = value
self._area = None
@property
def area(self):
if self._area is None:
self._area = self._compute_area()
return self._area
def _compute_area(self):
a = (self.s1 + self.s2 +self.s3)/2
return (a*(a - self.s1)*(a-self.s2)*(a-self.s3))**0.5
一个更轻的版本,没有进入一个成熟的描述符实现。
def make_side_property(name):
def get(self):
return getattr(self, name)
def set(self, value):
setattr(self, name, value)
self._area = None
return property(get, set)
class Triangle:
def __init__(self, sa1, sa2, sa3 ):
self.s1 = sa1
self.s2 = sa2
self.s3 = sa3
# Here we do let the setters initialize self._area
s1 = make_side_property("_s1")
s2 = make_side_property("_s2")
s3 = make_side_property("_s3")
@property
def area(self):
if self._area is None:
self._area = self._compute_area()
return self._area
def _compute_area(self):
a = (self.s1 + self.s2 +self.s3)/2
return (a*(a - self.s1)*(a-self.s2)*(a-self.s3))**0.5
推荐阅读
- mongodb - 未定义 DEFAULT 的 AuthProvider
- r - `stringr` 仅将数据框中的第一个字母转换为大写
- node.js - Redux Toolkit createAsyncThunk.ts 中的 Typescript 编译错误
- go - 如何根据创建时间对 pod 进行排序
- android - 如何在我的 android 布局上堆叠多个图像视图?
- angular - 如何以角度对窗口对象进行单元测试
- python - 向量化 for 循环,它结合了两个不同的数据帧
- apache - 多个网站无限 index.php 循环
- arrays - 在聚合函数中循环遍历数组
- e-signature - 无法通过 adobesign 中的 Rest API 更新协议中的表单字段