Quiero aprender OOP. Conozco Python y sé muy pocas cosas sobre OOP.
Pero cuando busco "aprender OOP" en los foros, vi a un chico que decía: "Python es tan nuevo, por eso no puedes aprender OOP en Python. Debes aprender Java y luego entender OOP en Java".
¿Es verdad? ¿Hay alguna diferencia en entender la POO en diferentes lenguajes de programación? como aprenderlo en Java, C #, C ++, Perl o Python?
java
object-oriented
python
usuario2783998
fuente
fuente
Respuestas:
Un objeto como construcción teórica es muy simple: es una estructura que almacena datos, funciones o ambos. La idea es que estas estructuras tienen un sentido de "yo" que está implícito en la mayoría de los lenguajes fuera de Python. Esto se llama un "descriptor" y le da al objeto un punto de auto referencia que une datos (variables o campos) y funciones (típicamente llamados métodos) al objeto particular en cuestión. La idea es que está utilizando específicamente una variable o método que pertenece a esa instancia particular (bloque de memoria asignado típicamente debajo) en lugar de a una construcción más grande y más general.
Los sistemas de objetos tienden a variar con respecto a dos grandes categorías: herencia y acceso.
Algunos, como Java o C ++, han declarado clases que actúan como "planos" para los objetos que luego se asignan. Estas clases y sus objetos no pueden modificarse estructuralmente una vez instanciados. Pueden anular sus contenidos en el sentido de que las variables pueden cambiar pero su estructura es estática. No puede, por ejemplo, agregar nuevos métodos a HashMap en Java. Puede ampliar la interfaz (clases implementadas básicamente parcialmente que sirven como contratos) o crear una subclase para obtener los métodos o variables adicionales que necesita junto con todas las variables y métodos originales de la clase en cuestión.
Otros lenguajes basados en clases, el más comúnmente citado es Ruby, le permiten abrir fácilmente una clase existente y simplemente agregar métodos como mejor le parezca. Este es un punto de discusión y muchos lo consideran muy, muy peligroso.
Javascript es incluso más flexible, los objetos no son más que una colección de ranuras para variables o funciones. Se pueden cambiar o sobrescribir siempre que el programador sienta la necesidad de hacerlo. Incluso pueden clonarse arbitrariamente como "Prototipos" para otros objetos, transmitiendo así todas sus habilidades.
El control de acceso es el otro gran punto de diferencia entre los distintos idiomas.
Algunos lenguajes como Java tienen modificadores de acceso estrictamente forzados como "privado" y "protegido", que definen exactamente qué clases y subclases pueden usar una variable o método dado.
Otros, como Python, son menos formales y utilizan la convención de un guión bajo antes del método o el nombre de la variable para indicar que es privado.
En última instancia, Python es un lenguaje perfectamente legítimo para programar de una manera orientada a objetos, simplemente no lo aplica tan rigurosamente como algunos de los otros.
fuente
private
para Java y subrayado (__
) para Python. Creo que el nivel de abstracción de Python podría hacerlo un poco más desafiante para un principiante, pero definitivamente no es imposible. Java lo explica para el programador, lo que puede hacer que algunos conceptos se adhieran un poco más fácilmente.Aprender los principios de OOP no es un lenguaje específico en absoluto, así que si por "aprender OOP" quieres decir "aprende lo que significa la terminología, qué es OOP y por qué podría querer usarlo", entonces el idioma no importa.
Si quiere decir "aprender a desarrollar usando OOP", entonces sí, los diferentes idiomas lo manejan de manera diferente, pero todos comparten el mismo conjunto de principios. Si eres como yo, lo aprenderás mejor con solo hacerlo. Elija un lenguaje orientado a objetos con un buen tutorial o libro que cubra los aspectos orientados a objetos y tenga en él. Si tiene los principios del diseño orientado a objetos, podrá usarlos en cualquier otro lenguaje OO.
Esto solo me duele la cabeza. Tanto mal metido en una oración.
Python data de 1989.
http://python-history.blogspot.com/2009/01/brief-timeline-of-python.html
Java a 1995.
http://www.oracle.com/technetwork/java/javase/overview/javahistory-index-198355.html
Puedes sacar tus propias conclusiones sobre la validez de ese consejo ...
fuente
Creo que la persona que estás citando simplemente estaba mostrando machismo lingüístico.
En realidad, hay una diferencia entre los conceptos de OOP y la implementación de OOP. Poéticamente, esto se entiende mejor una vez que comprenda mejor algunos de los conceptos de POO.
Muchos programadores se sienten cómodos con solo unos pocos lenguajes similares, por lo que no tienen que ampliar sus capacidades o sufrir la incapacidad por un tiempo.
Entonces la pregunta se reduce a, ¿realmente Python le enseñará los conceptos de OOP?
Diré que puedes, siempre que tengas un apoyo de aprendizaje adecuado que te empuje a probar cosas que normalmente no explorarías en el aprendizaje autodirigido. Un libro o un mentor de algún tipo sería lo mejor. Mark Lutz escribe libros muy detallados, muy detallados y muy excelentes sobre Python, y recomendaría sus libros porque lo empujarán a hacer y aprender más.
Lo que debes recordar es que el camino de Python no es el único camino, ni es el único camino correcto. Cuantos más paradigmas de programación domines, mejor serás un programador. La forma en que Python hace OOP no es exactamente como lo hace C ++ o Java, pero los conceptos se transfieren bien.
fuente
Sí, las implementaciones de OOP son muy diferentes. Sin embargo, la teoría y los principios son los mismos, pero muchas personas consideran solo "OOP real" lo que hacen Java y C ++, que obtienes muchas referencias que se supone que son "independientes del lenguaje", pero que de hecho asumen lenguajes estáticamente basados en clases. .
Eso no significa que esas referencias sean malas o incluso limitadas; por ejemplo, el libro seminal "Gang of four" (GoF) "Patrones de diseño: elementos de software orientado a objetos reutilizables" es un excelente ejemplo de un gran trabajo que dice "OOP" cuando realmente significa "OOP basada en clases estáticas".
Entonces, en mi opinión: Sí, puedes aprender mucha OOP en Python, Javascript, C y muchos otros lenguajes; pero algunas personas (tal vez un futuro empleador) cuando piden "experiencia OOP" se refieren a Java / C ++ / C #. Por lo tanto, sería aconsejable verificar esa otra vista también.
(y esos no son los únicos dos 'tipos' de OOP ...)
fuente
La Programación Orientada a Objetos es una idea sobre cómo estructurar el lenguaje de programación para fomentar un bajo acoplamiento, ocultación de información (también conocida como encapsulación), agrupamiento de datos y métodos que operan juntos en esos datos y reutilización de código. Muchos idiomas implementan su opinión sobre estas ideas, por lo que existen variaciones entre los idiomas acerca de cómo abordan la Orientación a objetos. Por ejemplo, Java solo permite que una clase extienda 1 clase. Sin embargo, Python y C ++ le permiten ampliar cualquier número de clases. Java tiene razones específicas para sus limitaciones. Limitaciones que están destinadas a corregir cosas de C ++, pero también porque Smalltalk solo admite una única clase base.
Los idiomas OO se pueden agrupar en dos familias. La familia Smalltalk (o POO basada en clases) de lenguajes incluye C ++, Java, Smalltalk, Ruby, C #, Python, por nombrar algunos (hay toneladas en esta familia). Estos son una combinación de lenguajes de tipo estático y dinámico y, aunque difieren ligeramente en algunos conceptos, son muy similares en cuanto a cómo piensan acerca de OOP. Lo que quiero decir con eso es cómo abordan el acoplamiento, la encapsulación, el enlace de datos y métodos, y la reutilización de código, y las herramientas que proporcionan para que lo haga. Dentro de esta familia, muchos de los conceptos son los mismos.
La otra familia es la OOP basada en el prototipo. Estos lenguajes se ven muy diferentes en su implementación de OOP. Probablemente el ejemplo más conocido de esto es Javascript, pero Javascript copió estas ideas de Scheme y Object LISP. Estos son idiomas menos conocidos y típicamente escritos dinámicamente. No puedo pensar en un lenguaje basado en prototipos estáticamente tipado, pero eso no significa que no haya ninguno. Puede leerlo aquí: http://en.wikipedia.org/wiki/Prototype-based_programming . El punto es que se acercan a OOP de una manera muy diferente a los lenguajes basados en clases. Eso significa que los conceptos no son tan portátiles entre estas dos familias. El hecho de que sepa OO en una familia no significa que pasará fácilmente esas ideas a la otra familia.
Tenga en cuenta que la mayoría de los lenguajes de programación mezclan conceptos de muchas ideas. Python y Ruby incorporan ideas de programación funcional y OOP en sus lenguajes. Y puede mezclar OO basado en prototipos con ciertas extensiones de lenguajes basados en clases para que sea aún más complejo.
fuente
OOP es un principio de programación, es fundamentalmente una idea. La implementación de OOP varía en todos los lenguajes de programación, pero los pilares (abstracción, herencia, encapsulación y polimorfismo) de OOP generalmente están presentes de alguna forma o forma.
Diré sin preferencia a ninguno de los dos idiomas, que Java empuja la semántica un poco más duro en el programador que Python.
Por ejemplo,
Código Java:
class Cat extends Animal {}
Es un poco más obvio en cuanto a lo que está haciendo desde el punto de vista de las cosas que:
Código de Python:
class Cat(Animal):
Claro que ambos definen una jerarquía de clases en la que Cat hereda de Animal. Pero creo que para un programador que acaba de comenzar en OOP, la aplicación y las implicaciones de las ideas de OOP podrían quedarse un poco mejor en Java, ya que lo está explicando para el programador.
fuente
Usted está preguntando explícitamente cuál es el lenguaje más fácil para aprender conceptos OOP. Creo que la respuesta es clara: python .
Para mostrar por qué este es el caso, echemos un vistazo al típico programa para principiantes en Java vs Python. Hagamos un simple juego de adivinanzas más alto-bajo.
Java
En Java, escribirás una clase de juego.
Soy un programador experimentado e incluso estoy teniendo dificultades. Además, mira lo que necesitas explicarle a un posible alumno para este sencillo programa:
this.
notación para referirse a variables cuando están enmascaradas por otrosSystem.out
es un outputStream. Y sí, es un campo, pero es unstatic
campo.String[]
es una matriz Es un tipo especial de objeto, pero, de nuevo, en realidad no.int
Es un tipo primitivo. Es especialPitón
Python es mucho más "puro". No hay tipos primitivos. No existe un constructor, solo hay un método especial que se llama en la inicialización.
No necesita interactuar con la consola, ya que tiene un
REPL
. Simplemente puedes jugar el juego usandog.guess(35)
y devolviendo una cadena.Esto hace que el lenguaje sea más fácil de aprender y comprender los conceptos básicos de OOP.
fuente
La idea central en OOP es encapsular (lo que significa agrupar u ocultar) variables y métodos juntos dentro de las clases (que Python es absolutamente compatible). Se trata de diseñar su código alrededor de sustantivos. Entonces, de alguna manera continúa desde allí.
Si bien existen diferencias de implementación (por ejemplo, python no admite la visibilidad como Java) y diferencias de sintaxis (en Javascript, debe heredar los métodos usted mismo), el diseño básico sigue siendo el mismo.
Sin embargo, creo que es más fácil aprender OOP en un lenguaje como Java, porque el lenguaje lo requiere y la comunidad es menos adversa que, digamos, la comunidad python.
Pero hay toneladas de escritos sobre el diseño y las prácticas de OOP, y leerlo no es un esfuerzo desperdiciado. Incluso cuando escribo python (que es mucho), escribo muchos objetos y uso muchos objetos de bibliotecas de terceros.
fuente
Cuando aprendes OOP en un idioma, comienzas a pensar en este idioma. El lenguaje influye en lo que crees que se puede hacer y cómo, y también agrega un sabor a OOP.
Algunas personas no pueden hacer POO sin clases. Algunos deben matar sus objetos con el proceso.
Hay un núcleo de OOP y las ideas originales al respecto. También puedes echar un vistazo a Smalltalk, Self, Simula, LISP, Newspeak. Y también un vistazo a los tipos de idiomas que no son OOP, como los idiomas de flujo de datos bash, APL, J. Logical ones Prolog. Haskell (clases de tipo). Todos te enseñarán un pensamiento diferente y puedes aprender que
Y al final puede ver para qué sirve la POO. Al menos tendrás otra idea al respecto. Sugiero encontrar charlas de Alan Kay .
Si no miras los idiomas, esta publicación es inútil.
Como puede ver aquí: no podemos acordar qué es OOP.
fuente