2012-04-23 16 views
30

Quiero pedir métodos en una clase de Python, pero no sé cuál es el orden correcto.¿Cuál es una buena manera de pedir métodos en una clase de Python?

Cuando extraigo métodos en Eclipse con PyDev, Eclipse coloca el método extraído encima del método modificado. Pero esto pone los detalles de nivel inferior antes de los detalles de nivel superior. Según el tío Bob, debería hacer lo contrario para que mi código se lea como los titulares de un periódico. Cuando programo Java solo sigo su consejo.

¿Cuál es la mejor práctica para Python?

+5

No hay una mejor práctica.Haz lo que tenga más sentido: lo importante cerca de la cima es una buena idea, y la consistencia es generalmente algo bueno. PEP-8 no menciona esto, y si fuera grabado en piedra, allí estaría. –

+3

E incluso PEP8 no siempre está escrito en piedra. –

+1

Normalmente lo hago por grupo en la funcionalidad (obtener, establecer, etc.) – CppLearner

Respuesta

11

No hay una orden correcta. Elija un sistema y quédese con él. El que yo uso es:

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" 
+0

¿Cuál es su preferencia para los métodos estáticos, las variables de clase y los métodos decorados @property? –

+0

@JohnMee: variables de clase que pongo antes que cualquier otra cosa; mi método de plegado oculta el '@ staticmethod',' @ classmethod', '@ property', y cualquier otra línea' @ decorator', así que utilizo el tipo del método para determinar dónde va (con la excepción de que las propiedades tienden a ir entre '_private_methods' y' normal_methods'). –

+0

Entonces, si el orden pasa básicamente de métodos "mágicos" muy privados a métodos privados y normales, ¿significa eso '@ classmethod's coming next (' @classmethod def a_class_method (cls) ') y luego' @ static methodhs' ('@ staticmethod def a_static_method() ')? Al menos esa es la política tal como la entiendo ... ** (sin mi IDE doblando nada porque no me gusta) ** – Kawu

1

hago algo similar a @Ethan que vi en la fuente de Django, donde la principal diferencia es grande "############" bloquear a los comentarios delimitar las áreas. Por ejemplo,

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" 

Obviamente esto es menos útil para clases más pequeñas.

+9

Pero puedo ver que son mágicos, públicos o privados. Me desagradan activamente esos bloques de comentarios, yo mismo; Puedo ver el código doblado si quiero ver una lista de todos ellos. Tener un comentario sobre un bloque particular de métodos relacionados con la funcionalidad es algo que haría, pero para este tipo de comentarios, eso es lo que me dicen los nombres de los métodos. –

+0

Una vez más, solo hago esto para clases más grandes. Encuentro que es fácil confundir los métodos mágicos con métodos semiprivados (_) y con nombres manchados (__). –

13

Como han señalado otros, no hay una manera correcta de ordenar sus métodos. Tal vez una sugerencia PEP sería útil, pero de todos modos. Permítanme tratar de enfocar su pregunta lo más objetivamente posible.

  • Interfaces primera: métodos Públicas y funciones mágicas Python definir la interfaz de la clase. La mayoría de las veces, usted y otros desarrolladores desean usar una clase en lugar de cambiarla. Por lo tanto, estarán interesados ​​en la interfaz de esa clase. Ponerlo primero en el código fuente evita desplazarse por los detalles de implementación que no le importan.

  • Propiedades, funciones mágicas, métodos públicos: Es difícil definir el mejor orden entre esos tres, que son todos parte de la interfaz de la clase. Como dice @EthanFurman, es más importante seguir con un sistema para todo el proyecto. En general, la gente espera __init__() a la mejor primera función de la clase, así que sigo con los otros métodos mágicos justo debajo.

  • Orden de lectura: Básicamente, hay dos formas de contar una historia: de abajo hacia arriba o de arriba hacia abajo. Al poner primero las funciones de alto nivel, un desarrollador puede obtener una comprensión aproximada de la clase leyendo las primeras dos líneas. De lo contrario, uno tendría que leer toda la clase para comprender la clase y la mayoría de los desarrolladores no tienen tiempo para eso. Como regla general, coloque los métodos sobre todos los métodos llamados desde su cuerpo.

  • Los métodos de clase y métodos estáticos: Por lo general, esto está implícito en el orden de lectura explicó anteriormente. Los métodos normales pueden llamar a todos los métodos por tiempos y, por lo tanto, son lo primero. Los métodos de clase solo pueden llamar a métodos de clase y métodos estáticos y vienen a continuación. Los métodos estáticos no pueden llamar a otros métodos de la clase y son los últimos.

Espero que esto ayude. La mayoría de estas reglas no son específicas de Python por cierto. No conozco un lenguaje que imponga el orden de los métodos, pero si es así, sería bastante interesante y por favor comente.

+0

Por lo general, un idioma no exige orden. Pero algunos idiomas tienen convenciones comunes. P.ej. [C# StyleCop] (https://github.com/StyleCop/StyleCop) tiene reglas de pedido estrictas. Para Java, consulte http://stackoverflow.com/questions/4668218, etc. – xmedeko

Cuestiones relacionadas