使方法模块化或依赖/链接是否有意义?

时间:2017-12-02 23:59:49

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

我正在学习python,并且一般都是编程,我从更哲学的角度对某些东西感到好奇。具体来说,我想知道在类中完全模块化或在某种程度上依赖于彼此的单个方法是否有意义。

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

班级中2个方法的模块化示例:

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()检索的数据。这将允许更短的方法,也更容易调用,但我担心这是错误的方式,因为它不允许多功能性。

非常感谢有关此事的任何意见!

2 个答案:

答案 0 :(得分:0)

在我个人看来(就像那是什么),最有用的方法是让它们彼此分离,但有一个功能可以一起计算它们。

参见代码:

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(注意:不在一行上,因为这将是非常难以理解的)以及您想要的任何变量来快速计算它们,并且它为您完成所有繁重的工作。 / p>

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

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

希望这有帮助!

答案 1 :(得分:0)

我看待它的方式是为了提高可读性,因为您(并且很可能是其他人)也必须仔细检查您的代码。在这方面,您需要一种适合您的方法。

这是我的方法:

保持每种方法与其他方法不同。如果您正在考虑使用辅助方法,那么将它们保存在它们所使用的方法中是一个好主意,或者(如果在同一操作中使用了很多)将它们组合在它们自己的类中。

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!"