114

我想对 Python 类中的方法进行排序,但我不知道正确的顺序是什么。

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

Python的最佳实践是什么?

4

4 回答 4

100

正如其他人指出的那样,没有正确的方法来订购您的方法。也许 PEP 建议会很有用,但无论如何。让我尽量客观地回答你的问题。

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

  • 属性、魔术方法、公共方法:很难定义这三者之间的最佳顺序,它们都是类接口的一部分。正如Ethan Furman 所说,在整个项目中坚持使用一个系统是最重要的。一般来说,人们期望__init__()在课堂上最好的第一个函数,所以我跟进下面的其他魔术方法。

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

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

顺便说一下,这些规则中的大多数都不是特定于 Python 的。我不知道强制方法顺序的语言。

于 2016-05-01T14:17:35.983 回答
17

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

class SomeClass(object):

    def __magic_methods__(self):
        "magic methods first, usually in alphabetical order"

    def _private_method(self):
        "worker methods next, also in alphabetical order"

    def a_method(self):
        "then normal methods, also in alphabetical order"
于 2012-04-23T23:22:16.730 回答
3

我做的事情类似于我在 Django 的源代码中看到的Ethan ,主要区别在于大的“############”块注释来分隔区域。

例如,

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"

显然,这对于较小的班级不太有用。

于 2012-04-23T23:28:31.537 回答
1

编码

class Bar(_Foo):
    pass

class _Foo:
    pass

引发异常,因为_Foo必须在使用之前定义类。您也可以找到类似的函数异常引发示例:

def bar(f=_foo):
    pass

def _foo():
    pass

鉴于这些示例,通常在公共类和函数之前定义私有类和函数是有意义的。这就是为什么保持一致性并在公共方法之前定义私有方法是有意义的。

于 2021-08-16T12:27:44.227 回答