【问题标题】:Best class structure practice for step by step object manipulation in pythonpython中逐步对象操作的最佳类结构实践
【发布时间】:2017-07-05 11:44:14
【问题描述】:

您好,我想创建一个具有多种方法的类。每种方法都依赖于另一种方法的结果。一个简化的示例如下所示:

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

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

请注意,这是一个复杂类的更简单的版本

【问题讨论】:

    标签: python class syntax


    【解决方案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"]
    

    附:不要使用名称klass

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

      • 是的,这是真的。但这会减慢我的代码速度。即,如果有人需要方法 1 并且在一段时间后也需要方法 2,则最好不再运行方法 1(因为它已经计算并保存)。
      • 但这只是在执行 method1 时设置的布尔变量的快速检查,对吧?
      【解决方案3】:

      您可以在一个地方编写单独的函数来聚合您需要的函数:

      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
      

      【讨论】:

        猜你喜欢
        • 2015-01-13
        • 1970-01-01
        • 2014-03-21
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-09-06
        • 2014-03-02
        • 1970-01-01
        相关资源
        最近更新 更多