首页 > 解决方案 > 在 Python 类定义中放置多个带有 return 的函数是否正确?

问题描述

这是查找三角形面积的代码,其中我已经初始化了三角形的尺寸,def __init__ 并且我还需要为这些初始尺寸初始化它的面积,为此我也放在self.a1def __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}')

标签: pythonpython-3.xoop

解决方案


我会将区域定义为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

推荐阅读