在Python类中订购方法的好方法是什么?

时间:2012-04-23 23:02:10

标签: python

我想在Python类中订购方法,但我不知道正确的顺序是什么。

当我使用PyDev在Eclipse中提取方法时,Eclipse将提取的方法放在修改后的方法之上。但是这会将较低级别的细节放在更高级别的细节之前。据鲍勃叔叔说,我应该这样做,以便我的代码读起来像报纸的头条新闻。当我编写Java程序时,我只是按照他的建议。

Python的最佳做法是什么?

3 个答案:

答案 0 :(得分:35)

正如其他人所指出的,没有正确的方法来订购你的方法。也许PEP建议会有用,但无论如何。让我尽可能客观地处理你的问题。

  • 首先是接口:公共方法和Python魔术函数定义了类的接口。大多数情况下,您和其他开发人员希望使用类而不是更改它。因此,他们会对该类的界面感兴趣。将它放在源代码中的第一位可以避免滚动浏览您不关心的实现细节。

  • 属性,magic methods,公共方法:很难定义这三者之间的最佳顺序,这些顺序都是该类接口的一部分。正如@EthanFurman所说,坚持整个项目的一个系统是最重要的。一般来说,人们期望__init__()达到班级中最好的第一个功能,所以我会跟进下面的其他魔术方法。

  • 阅读顺序:基本上,有两种方式讲故事:自下而上或自上而下。通过首先放置高级函数,开发人员可以通过阅读前几行来粗略地理解类。否则,人们必须阅读整个班级才能理解课程,大多数开发人员都没有时间。根据经验,将方法置于从其身体调用的所有方法之上。

  • 类方法和静态方法:通常,上面解释的阅读顺序暗示了这一点。普通方法可以调用所有方法次数,因此可以先行。类方法只能调用类方法和静态方法,接下来。静态方法不能调用类的其他方法并且最后一个。

希望这会有所帮助。这些规则中的大多数都不是特定于Python的。我不知道一种强制执行方法顺序的语言,但如果是这样,那就非常有趣了,请发表评论。

答案 1 :(得分:13)

没有一个正确的订单。选择一个系统并坚持下去。我使用的是:

class SomeClass(object):
    def __magic_methods__(self):
        "magic methods first, usually in alphabetical order"
    def _private_method(self):
        "worker methods next, also in alpha order"
    def a_method(self):
        "then normal methods, also in alpha order"

答案 2 :(得分:2)

我做了类似于@Ethan的事情,我在Django的源代码中看到,主要的区别是大的“############”阻止区域划分的注释。例如,

class SomeClass(object):
    #################
    # Magic Methods #
    #################
    def __magic_methods__(self):
        "magic methods first"

    ##################
    # Public Methods #
    ##################
    def a_method(self):
        "then normal methods, in order of importance"

    ###################
    # Private Methods #
    ###################
    def _private_method(self):
        "then worker methods, grouped by importance or related function"

显然,这对较小的类来说不太有用。