python中逐步对象操作的最佳类结构实践

时间:2017-07-05 11:44:14

标签: python class syntax

您好我想用多种方法创建一个类。每种方法都取决于另一种方法的结果。一个简化的例子如下:

class klass(object):
def __init__(self, x, y):
    self.x = x
    self.y = y
    self.results = 0

def method1(self):
    self.results = self.x + self.y
    return self.results

def method2(self):
    self.results = math.sqrt(self.results)
    return self.results

method2 应仅在 method1 之后调用。即:

>>> b=klass(3.0, 4.0)
>>> b.method1()
7.0
>>> b.method2()
2.6457513110645907

这个想法是有人可能只需要 method1 的结果,而其他人也可能需要 method2 的结果。所以第一个人只需要运行 method1 ,第二个人需要运行 method1 然后 method2

最好(最可读和最简单)的方法是什么。

请注意,这是复杂类

的更简单版本

3 个答案:

答案 0 :(得分:1)

我会将结果切换为字典并分别保存每个级别的结果。然后,您可以检入每个方法if "level1" not in self.results: raise an exception,但是您仍然可以向用户提供每个级别的输出。此外,您可以通过检查结果是否已存在来启动每个方法。一个例子就是这样:

class klass(object):
def __init__(self, x, y):
    self.x = x
    self.y = y
    self.results = {"level0": 0}

def method1(self):
    if "level1" not in self.results:
        self.results["level1"] = self.x + self.y
    return self.results["level1"]

def method2(self):
    if "level1" not in self.results:
        raise ValueError("The results of method1 are not yet available")
    if "level2" not in self.results:
        self.results["level2"] = math.sqrt(self.results["level1"])
    return self.results["level2"]

P.S。请勿使用名称klass

答案 1 :(得分:0)

如果我弄错了,请纠正我,但你不能像这样在方法2中调用method1:

def method2(self):
    self.method1()
    self.results = math.sqrt(self.results)
    return self.results

答案 2 :(得分:0)

您可以编写单独的函数来在一个位置聚合所需的函数:

class klass(object):

    def __init__(self, x, y):
        self.x = x
        self.y = y
        self.results = 0

    def method1(self):
        self.results = self.x + self.y
        return self.results

    def method2(self):
        self.results = math.sqrt(self.results)
        return self.results

    def both_methods(self):
        self.method1()
        self.method2()
        return self.results