2010-10-21 22 views
8

He visto a algunas personas escribiendo código Python creando una clase y luego un objeto para llamar a todos los métodos. ¿Hay alguna ventaja de usar clases si no hacemos uso de herencia, encapsulado, etc.? Tal código me parece menos limpio con todos estos argumentos "propios", que podríamos evitar. ¿Es esta práctica una influencia de otros lenguajes de programación como Java o hay alguna buena razón por la cual los programas de Python deberían estructurarse así?¿Hay alguna razón para usar clases en Python si solo hay una clase en el programa?

código de ejemplo:

class App: 

# all the methods go here 

a = App()  
+2

Me parece que es solo una reliquia de otros lenguajes como Java que tienen todos los códigos en una clase. Pero dejaré que alguien más experimentado dé una mejor razón. –

Respuesta

7

Una de las ventajas, aunque no siempre es aplicable, es que hace que sea fácil de extender el programa como subclase la clase. Por ejemplo, puedo subclasificarlo y anular el método que lee, digamos, un archivo csv para leer un archivo xml y luego crear una instancia de la subclase o clase original en función de la información del tiempo de ejecución. A partir de ahí, la lógica del programa puede proceder normalmente.

Eso, por supuesto, plantea la pregunta si la lectura del archivo es realmente responsabilidad de la clase o más pertenece a una clase que tiene subclases para leer diferentes tipos de datos y presenta una interfaz uniforme con esos datos, pero eso es por supuesto, otra pregunta.

Personalmente, considero que la forma más limpia de hacerlo es poner funciones que hacen suposiciones fuertes sobre sus parámetros en la clase apropiada como métodos y poner funciones que hacen suposiciones muy débiles sobre sus argumentos en el módulo como funciones.

+2

+1. Me gusta empaquetar mis aplicaciones como objetos de aplicación subclasables, para que puedan ser personalizados por una subclase y diferentes versiones personalizadas ejecutadas en paralelo (lo que no sería posible con el parche de mono). Esto tiende a involucrar muchas clases internas, también subclasificables, para aplicaciones más complicadas. – bobince

+0

Eso tiene perfecto sentido. Gracias aaronasterling y bobince! – Thea

+0

Me gusta su razón de ser; Creo que influirá en cómo codigo. – Alan

4

A menudo hago lo mismo para las partes gerentes de una aplicación que, en teoría, podría reducirse a una programación simple, muy secuencial y funcional.

La principal ventaja (para mí) es que encapsula bien el bucle principal o ejecución de ejecución única, y permite configurar y ejecutar datos de manera eficiente y limpia en bloques, fundamentalmente reconfigurarlo como necesario sin tener que cambiar el código en sí. Por no mencionar la capacidad de subclase de una ejecución a una diferente y extendida.

También tiende a ser mucho más fácil expandir el principal de esa manera, entonces es cuando tienes un bloque sólido de 200 líneas que giran en lugar de cosas de ámbito críptico.

El yo, después de escribir suficiente Python, desaparece como un impedimento, y personalmente me gusta cómo ofrece de inmediato una distinción visual entre lo que obviamente quiero persistir en todos los ámbitos, y lo que es un elemento desechable que QUIERO quedarme fuera del alcance y ser recogido tan pronto como se realice un paso en particular.

Por último, algunas personas se opondrán a todo lo que tengan en sus manos, o no podrán leerlo. Soy uno de ellos :)

+0

Bueno, siempre puedes usar una función principal para tu ejecución 'ejecutar una vez', pero si deseas extender el programa en el futuro, tiene sentido tener un diseño orientado a objetos. Gracias por su respuesta :) – Thea

3

1. Sé de un uso para esto.

Aunque esto se puede lograr por otros medios. Asegura que ambos módulos - module_B y module_C usan la misma instancia de aplicación y no crean instancias de objetos separados.

En module_A.py

class App: 
    .... 

a = App() 

En module_B.py

from module_A import a 

En module_C.py

from module_A import a 

Por supuesto, podría crear objetos separados pero esa no era la intención de los módulos anteriores.

Lo que si se hizo lo siguiente en module_D.py

from module_A import App 
a = App() 

2. [pedante]

Se puede evitar el uso de clases y descomponer su solución usando sólo los módulos y funciones. Pero no se verá feo en un programa grande. ¿No le gustaría usar un paradigma orientado a objetos en su programa? Todos los idiomas proporcionan cierta forma de aprovechar OO. A todos nos gusta una cosa u otra y algunos nos rechazan. Explícito es mejor que implícito es generalmente el camino de Python. Aunque esta no es razón suficiente para su inclusión.

+0

¡Muchas gracias! Muy, muy útil :) – Thea

1

¿Hay alguna ventaja de usar clases si no hacemos uso de herencia, encapsulado, etc.?

Sí.

esta práctica una influencia de otros lenguajes de programación como Java

hay ninguna buena razón por la cual los programas de Python deben ser estructurados de esta manera?

Sí.

Sin embargo. A partir de su pregunta, ha decidido claramente que "Este código me parece menos limpio con todos estos argumentos 'propios'".

No tiene mucho sentido explicar las ventajas de una declaración de clase si ya está seguro de que es "menos limpia".

Considere esto.

  1. Una secuencia de comandos nunca es estática.
  2. Se tendrá que cambiar un diseño sin clases.
  3. En algún momento, los cambios darán lugar a una segunda clase.

Línea inferior.

Puede trabajar sin una clase por breves instantes. Hasta que hagas cambios Entonces te arrepentirás de no tener la palabra class y todos esos argumentos propios "inmundos".

Los agregará eventualmente.

¿Por qué esperar?

2

Tiendo a usar clases cuando creo que es probable que necesite varias instancias de algo, o si creo que heredar será útil. Si solo estoy buscando una forma de agrupar funciones relacionadas y configuraciones que afectan su comportamiento, bueno, un módulo puede funcionar igual de bien para eso, con menos sintaxis.A veces usaré ambos enfoques en el mismo módulo.

Además, aunque puede escribir decoradores y gestores de contexto como clases, yo personalmente tiendo a encontrarlos más claros cuando se escriben como funciones, así es como normalmente los escribo.

Python es un lenguaje de programación multi-paradigma. Use cualquier enfoque que sienta exprese su intención más claramente. Nunca necesita para usar OO.

Un enfoque que me gusta usar es pensar en cómo me gustaría las diversas funciones que me proporcionaron si alguien más iba a escribir un módulo para resolver un problema como el mío de una manera genérica. Básicamente, primero intento diseñar las interfaces entre mis módulos y hacer que cada uno sea lo más simple y fácil de usar posible. En este punto, comienza a quedar claro para mí qué enfoque debería usar para cada parte de la funcionalidad.

Pero solo soy un hombre, y la programación no es mi trabajo principal.

+0

Siempre he pensado que los administradores de contexto como funciones se ven raros y poco comunes. Estoy pensando en ti cuando es posible usar una función como decorador, es lo correcto en la mayoría de los casos. – aaronasterling

+0

Para cada uno, y por supuesto mis opiniones están sujetas a cambios a medida que aprendo más sobre Python. Lo que me gusta de los gestores de contexto como funciones es que no tienes que usar variables de instancia si deseas compartir estado entre tu '__enter __()' y '__exit() __'. Simplemente los viejos lugareños funcionan bien. – kindall

Cuestiones relacionadas