131 votes

Quelle est la meilleure façon d'ordonner les méthodes dans une classe Python ?

Je veux ordonner les méthodes dans une classe Python, mais je ne sais pas quel est l'ordre correct.

Lorsque j'extrais des méthodes dans Eclipse con PyDev Eclipse place la méthode extraite au-dessus de la méthode modifiée. Mais cela fait passer les détails de niveau inférieur avant les détails de niveau supérieur. D'après Oncle Bob Je devrais plutôt faire le contraire, afin que mon code se lise comme les titres d'un journal. Lorsque je programme en Java Je me contente de suivre ses conseils.

Quelle est la meilleure pratique pour Python ?

118voto

danijar Points 4522

Comme d'autres l'ont souligné, il n'y a pas de bonne façon d'ordonner vos méthodes. Peut-être qu'une suggestion du PEP serait utile, mais peu importe. Permettez-moi d'essayer d'aborder votre question de la manière la plus objective possible.

  • Les interfaces d'abord : Les méthodes publiques et les fonctions magiques Python définissent l'interface de la classe. La plupart du temps, vous et les autres développeurs souhaitez utiliser une classe plutôt que de la modifier. Ils s'intéresseront donc à l'interface de cette classe. En la plaçant en premier dans le code source, vous éviterez de faire défiler des détails d'implémentation qui ne vous intéressent pas.

  • Propriétés, méthodes magiques , des méthodes publiques : Il est difficile de définir le meilleur ordre entre ces trois éléments, qui font tous partie de l'interface de la classe. En tant que Ethan Furman dit Il est donc essentiel de s'en tenir à un seul système pour l'ensemble du projet. En général, les gens s'attendent à ce que __init__() à la meilleure première fonction de la classe, je poursuis donc avec les autres méthodes magiques juste en dessous.

  • Ordre de lecture : Fondamentalement, il y a deux façons de raconter une histoire : De bas en haut ou de haut en bas. En plaçant les fonctions de haut niveau en premier, un développeur peut obtenir une compréhension approximative de la classe en lisant les deux premières lignes. Sinon, il faudrait lire toute la classe pour la comprendre et la plupart des développeurs n'ont pas le temps de le faire. En règle générale, les méthodes doivent être placées au-dessus de toutes les méthodes appelées à partir de leur corps.

  • Méthodes de classe et méthodes statiques : En général, cela est impliqué par le ordre de lecture expliquée ci-dessus. Les méthodes normales peuvent appeler toutes les méthodes à la fois et viennent donc en premier. Les méthodes de classe ne peuvent appeler que les méthodes de classe et les méthodes statiques et viennent donc en second. Les méthodes statiques ne peuvent pas appeler d'autres méthodes de la classe et viennent en dernier.

La plupart de ces règles ne sont d'ailleurs pas spécifiques à Python. Je ne connais pas de langage qui impose l'ordre des méthodes.

22voto

Ethan Furman Points 12683

Il n'y a pas un seul ordre correct. Choisissez un système et respectez-le. Celui que j'utilise est le suivant :

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"

2voto

Matt Luongo Points 4671

Je fais quelque chose de similaire à Ethan que j'ai vu dans les sources de Django, où la principale différence est la présence de gros blocs de commentaires "############" pour délimiter les zones.

Par exemple,

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"

Il est évident que cela est moins utile pour les petites classes.

1voto

Jeyekomon Points 694

Le code

class Bar(_Foo):
    pass

class _Foo:
    pass

soulève une exception car la classe _Foo doit être défini avant d'être utilisé. Vous trouverez des exemples similaires de levée d'exception pour les fonctions :

def bar(f=_foo):
    pass

def _foo():
    pass

Compte tenu de ces exemples, il est logique de définir les classes et fonctions privées avant les classes et fonctions publiques. C'est pourquoi il est judicieux de maintenir la cohérence et de définir également les éléments suivants les méthodes privées avant les méthodes publiques .

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X