【问题标题】:Does make sense to make methods modular or dependent/linked?使方法模块化或依赖/链接是否有意义?
【发布时间】:2018-05-16 18:27:32
【问题描述】:

我正在学习 Python,并且在一般情况下进行真正的编程,我从更哲学的角度对某些事情感到好奇。具体来说,我想知道使类中的各个方法完全模块化或以某种方式相互依赖是否有意义。

例如,在我当前的用例中,我以一种依赖的方式使用类中的所有方法,这意味着一个方法的输出或返回值,然后用作下一个方法的参数。虽然在这种情况下,在下一个方法中直接调用该方法的值肯定会更容易,但我仍然使用泛型参数并以模块化方式对其进行编码,然后当我运行脚本时,我列出了一个有点长的依赖链命令调用它。我将举一个例子,因为我不确定我所说的是否有意义,但我想听听你们对此的看法。谢谢!!

类中两个方法的模块化示例:

def get_token(self, values, url):
    self.values = values
    self.url = url
    tls_version = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
    data = urllib.parse.urlencode(self.values).encode("utf-8")
    req = urllib.request.Request(self.url, data)
    res = urllib.request.urlopen(req, context=tls_version).read()
    response_js = json.loads(res)
    return response_js

def parse(self, json_block):
    self.json_block = json_block
    token = self.json_block['access_token']
    inst_url = self.json_block['instance_url']
    return token, inst_url

当我调用它时,它会产生一个很长的列表(即):

self.parse(get_token(values, url)) ... and this goes on as there are several other methods

当涉及到依赖示例时...它本质上看起来很相似,但它不允许指定参数,它只会使用从函数中的get_token() 检索到的数据。这将允许更短的方法并且更容易调用,但我担心这是错误的方法,因为它不允许多功能性。

非常感谢您对此事的任何意见!

【问题讨论】:

    标签: python python-3.x class methods parameters


    【解决方案1】:

    在我个人看来(就是这样),最有用的方法是让它们彼此分离,但有一个函数可以一起计算它们。

    查看代码:

    class Foo:
        def method1(self, var1, var2):
            # do things
            return var3, var4
    
        def method2(self, var1, var2):
            # do things
            return var3
    
        def method3(self, var1):
            # do things
            return var3, var4, var5
    
        def method4(self, var1, var2, var3):
            # do things
            return var3
    
        def calculate_meaning_of_life(self, var1, var2):
            inter_var1, inter_var2 = method1(var1, var2)
    
            inter_var3 = method2(inter_var1, inter_var2)
    
            inter_var4, inter_var5, inter_var6 = method3(inter_var3)
    
            answer = method4(inter_var4, inter_var5, inter_var6)
    
            return answer # happens to always output 42
    

    在这里,您可以使用任何您喜欢的参数调用Foo.method3,并立即获得结果,而无需通过其他函数或类似的痛苦。此外,您可以通过调用Foo.calculate_meaning_of_life func(注意:不要在一行,因为这将非常不可读)与您想要的任何变量一起快速计算它们,它会为您完成所有繁重的工作。

    特别是从调试的角度来看,您希望能够单独调用所有它们并分析它们返回的内容,因为最后,如果它们只能一起运行,为什么不只有一个函数呢?

    另外,如果您要制作软件包供其他人安装,他们会找到理由只为他们的特定项目使用Foo.method2,因此您应该使您编写的所有代码尽可能易于访问。

    希望这会有所帮助!

    【讨论】:

      【解决方案2】:

      我认为它是为了可读性,因为最终您(以及很可能其他人)将不得不审查您的代码。在这方面,您需要一种适合您的方法。

      这是我的方法:

      使每种方法都与其他方法不同。如果您正在考虑使用辅助方法,最好将它们保留在它们所使用的方法中,或者(如果在同一操作中使用很多)将它们分组到自己的类中。

      class MyClass:
          def distinct_method(self):
              def distinct_helper():
                  # helper
                  return ", right?"
              # do some distinct stuff
              return other_distinct_method() + distinct_helper()
      
          def other_distinct_method(self.):
              # do some other distinct stuff
              return "it should be distinct"
      
      if __name__ == "__main__":
          print MyClass().distinct_method()
      

      一个好的经验法则是不要让辅助方法成为类的一部分,除非它被多个其他实例方法使用,例如:

      class MyClass2:
          def helper(self):
              return "help!"
      
          def method1(self):
             return "I use " + self.helper()
      
          def method2(self):
              return "I also use " + self.helper()
      

      而不是

      class MyClass1:
          def helper(self):
              return "help!"
      
          def method1(self):
             return "I use " + self.helper()
      
          def method2(self):
              return "I don't use helper!"
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-02-11
        • 2017-10-19
        • 2012-05-24
        • 1970-01-01
        • 2018-01-01
        • 1970-01-01
        相关资源
        最近更新 更多