2009-05-21 14 views
9

Recuerdo que en un punto, it was said that Python is less object oriented than Ruby, ya que en Ruby, todo es un objeto. ¿Esto ha cambiado para Python también? ¿La última versión de Python está más orientada a objetos que la versión anterior?¿Cambió Python a más orientado a objetos?

+7

En Python, todo es un objeto. ¿Qué fuente leíste? ¿Puedes proporcionar una URL o un presupuesto? –

+5

@ S.Lott - Tiene razón; de hecho, la página "Acerca de" de Ruby aún cuenta que como el origen de Ruby.Matz es citado diciendo: "Yo quería un lenguaje de scripting que fuera más poderoso que Perl, y más orientado a objetos que Python." http://www.ruby-lang.org/en/about/ –

+0

Tengo el misma percepción. Python está más "estructurado" y Ruby nació para ser OO puro desde su inicio. Pero no puedo decir por qué ... – OscarRyz

Respuesta

40

Jian Lin - la respuesta es "Sí", Python es más objeto- orientado que cuando Matz decidió que quería crear Ruby, y ambos idiomas ahora cuentan con "todo es un objeto". Cuando Python era más joven, los "tipos" como cadenas y números carecían de métodos, mientras que los "objetos" se construían con la declaración "clase" (o construyendo deliberadamente una clase en un módulo de extensión C) y eran un poco menos eficientes pero soportaban métodos y herencia. Para principios de la década de 1990, cuando una rápida 386 era una máquina muy bonita, este compromiso tenía sentido. Pero los tipos y las clases se unificaron en Python 2.2 (lanzado en 2001), y las cadenas obtuvieron métodos y, en las versiones más recientes de Python, los usuarios incluso pueden subclase a partir de ellos.

Entonces: Python ciertamente estaba menos orientado a objetos a la vez; pero, hasta donde sé, cada una de esas viejas barreras ahora se ha ido.

Aquí está la guía para la unificación que tuvo lugar:

http://www.python.org/download/releases/2.2/descrintro/

Aclaración: tal vez pueda decirlo más simplemente: en Python, todo tiene siempre ha habido un objeto; pero algunos tipos básicos de objetos (ints, strings) una vez jugados por "reglas diferentes" que evitan que los métodos de programación OO (como la herencia) se utilicen con ellos. Eso ahora ha sido arreglado.El método len(), descrito en otra respuesta aquí, es probablemente lo único que me gustaría que Guido haya cambiado en la actualización a Python 3.0. Pero al menos me dio comprensión de diccionarios, así que no me quejaré demasiado fuerte. :-)

+0

¿Alguna vez Guido dio una razón por la que dejó fuera el método len() en 3.0? –

+0

Sí, hay un artículo en alguna parte. Básicamente su reasignación fue que len (my_list) es más fácil de leer que my_list.len(). – nikow

+6

@nemo, básicamente dijo que len (x) garantiza devolver un int, mientras que x.len() no tiene tal garantía. Y, que originalmente le gustó la forma en que se ve mejor. (Encontrados los correos electrónicos: http://mail.python.org/pipermail/python-dev/2008- enero/776575.html http://mail.python.org/pipermail/python-dev/2008- enero/76.612. html) – JimB

12

No estoy seguro de que compre el argumento de que Ruby está más orientado a objetos que Python. Hay más que orientarse a objetos que simplemente usar objetos y sintaxis de puntos. Un argumento común que veo es que en Python para obtener la longitud de una lista, hacer algo como esto:

len(some_list) 

Veo esto como una bikeshed argument. Lo que esto realmente se traduce a (casi directamente) es esto:

some_list.__len__() 

que está perfectamente orientado a objetos. Creo que los Rubyistas pueden confundirse porque, por lo general, estar orientados a objetos implica utilizar la sintaxis de puntos (por ejemplo, object.method()). Sin embargo, si malinterpreto los argumentos de los Rubyistas, siéntete libre de avisarme.

Independientemente de la orientación al objeto de esto, hay una ventaja de usar len de esta manera. Una cosa que siempre me molesta acerca de algunos idiomas es tener que recordar si se debe usar some_list.size() o some_list.length() o some_list.len para un objeto en particular. La forma de Python significa solo una función para recordar

+2

¿Por qué no exponer .len() directamente fuera de la lista, entonces? Creo que no se puede divorciar por completo el diseño OO de la sintaxis, porque la sintaxis, en gran medida, define el paradigma del código. some_list.len() es OO porque está pensando en la lista como un objeto que podrá decirle cuál es su longitud. len (some_list) no es OO, independientemente de lo que se traduzca en las cubiertas. –

+9

Lo siento. La sintaxis y OO no tienen nada que ver el uno con el otro. Los objetos de Python pueden tener sintaxis sin objeto. Todavía son objetos. –

+0

+1 Esta es una mejor respuesta. –

2

Espera, tanto Ruby como Python están orientados a objetos. Los objetos son objetos. No hay más 'función de comparación' orientada a objetos que te conduzca a la mejor. La sintaxis no es lo único que hace que un lenguaje parezca orientado a objetos, sino también modelo de datos.

Los objetos son la abstracción de Python para los datos. Todos los datos en un programa de Python están representados por objetos o por relaciones entre objetos. (En un sentido, y de conformidad con el modelo de Von Neumann “informático almacenado programa” código está también representada por objetos.) http://docs.python.org/reference/datamodel.html

2

Esta es una creencia incorrecta.

Véase mi respuesta anterior aquí para obtener más explicación en profundidad:

Is everything an object in python like ruby?

Por qué no exponga .LEN() directamente fuera de la lista a continuación? Creo que no se puede divorciar por completo el diseño OO de la sintaxis, porque la sintaxis, en gran medida, define el paradigma del código. some_list.len() es OO porque está pensando en la lista como un objeto que podrá decirle cuál es su longitud. len (some_list)

.len() está disponible directamente de la lista. Está disponible como __len __(). len() es un objeto de función. Puedes ver todos sus métodos con dir (len). Aunque no sé por qué Guido decidió hacer que el método __len __() sea más largo, no cambia el hecho de que todos esos son objetos.

+0

Pensé que llamar a __method__ directamente se desalentó en Python ya que __ era una abreviatura de privado. Creo que estoy confundiendo el __ con algo más. –

+0

Ah __method es distinto de __method__, el primero es privado (no obligatorio) y el último es "funciones especiales del sistema con un comportamiento predefinido". –

7

Aunque esta no es una respuesta adecuada ... ¿Por qué le preocupa que Python sea más o menos OO? Lo bueno de Python es que es pythonic, no orientado a objetos o funcional o cualquier paradigma que esté de moda en este momento. :-)

Aprendí a programar con Java y Object Orientation, pero ahora no me gusta nada porque sé que OOP no es la solución a todos los problemas (de hecho, no hay un solo paradigma)

ver:

+1

Esa moda OOP nunca durará. ¿Qué ha sido, tres décadas? – Glenn

1

Tengo el mismo "percepción" quizás deriva de esto:

Why was python created in the first place:

Se me ocurrió que un lenguaje de programación con una sintaxis como ABC [...] llenaría la necesidad

An Interview with the Creator of Ruby:

"Yo quería un lenguaje de script eso era más poderoso que Perl, y más orientado a objetos que Python

Sé que la percepción no es lo mismo que la realidad. Tanto Python como Ruby son excelentes lenguajes de programación y ambos son muy OO.

Cuestiones relacionadas