Python:使用依赖属性定义类

2024-05-16 23:19:14 发布

您现在位置:Python中文网/ 问答频道 /正文

我的目标是编写一个可以用来计算设备所有属性的类。在

import numpy as np


class pythagoras:
    def __init__(self, a=None, b=None, c=None):
        self.a = a
        self.b = b
        self.c = c

        if(a == None):
            assert(b != None)
            assert(c != None)
            self.a = np.sqrt(c**2 - b**2)
        elif(b == None):
            assert(a != None)
            assert(c != None)
            self.b = np.sqrt(c**2 - a**2)
        elif(c == None):
            assert(a != None)
            assert(b != None)
            self.c = np.sqrt(a**2 + b**2)
        else:
            assert (a**2 + b**2 == c**2), "The values are incompatible."


example1 = pythagoras(a=3, b=4)
print(example.c)
# 5
example2 = pythagoras(a=3, c=5)
print(example2.b)
# 4
example3 = pythagoras(b=4, c=5)
print(example3.a)
# 3

所以我的问题是简化这个例子:有没有更简单的方法来实现这类问题?对于更复杂的例子,它很快变得相当复杂和难以管理。在

应用

最终目标是要有一个具有所有设备属性的类,例如:

^{pr2}$

在这里我们可以想象这些性质相互依赖,根据我对性质的了解,我可以推断出其余的性质。在

对于任何关于编写更好的代码的评论,我都很优雅。尽管我学习并阅读了有关面向对象编码的文献,但在编写这方面我还是缺乏经验。在


Tags: importselfnone目标属性npsqrtassert
2条回答

试试这个:

import pandas as pd

class Pyth():
    def __init__(self, a=np.NaN, b=np.NaN, c=np.NaN):
        df = pd.DataFrame({
           'sides': [a,b,c], 
           'equation':[np.sqrt(c**2 - b**2), np.sqrt(c**2 - a**2), np.sqrt(a**2 + b**2)]
        })
        df.loc[df.sides.isnull(), 'sides'] = df[df.sides.isnull()]['equation']

        self.a = df.sides[0]
        self.b = df.sides[1]
        self.c = df.sides[2]

试验结果:

^{pr2}$

我认为一旦使用@property修饰符,计算起来就相当容易了。我给你举个例子。在

导入数学

class Pythagoras(object):

    def __init__(self, a=None, b=None, c=None):
        self._a = a
        self._b = b
        self._c = c

        count = 0
        if self._a is None:
            count += 1
        if self._b is None:
            count += 1
        if self._c is None:
            count += 1

        if count > 1:
            raise Exception("More than one of the values are None.")

    @property
    def a(self):
        if self._a is None:
            return math.sqrt(self.c**2 - self.b**2)
        else:
            return self._a

    @property
    def b(self):
        if self._b is None:
            return math.sqrt(self.c**2 - self.a**2)
        else:
            return self._b

    @property
    def c(self):
        if self._c is None:
            return math.sqrt(self.a**2 + self.b**2)
        else:
            return self._c

工作行为:

^{pr2}$

编辑:更新代码以确保它正常工作。在

相关问题 更多 >