2009-05-14 12 views
37

Un comentario sobre otra pregunta de Stack Overflow afirma que Python era como Ruby, ya que se relaciona con "todo es un objeto", y todo en Python era un objeto, al igual que Ruby.¿Es todo un objeto en Python como el rubí?

¿Es esto cierto? ¿Es todo un objeto en python como el rubí?

¿En qué se diferencian los dos o son realmente iguales? Por ejemplo, se puede tomar un número y hacer las cosas de rubí que he visto así:

y = 5.plus 6 

se puede hacer esto de la misma manera en Python?

+0

Cuando dices "objeto", ¿te refieres exactamente a la terminología OOP? Tanto python como ruby ​​son lenguajes novatos, por lo que la pregunta tiene más sentido para mí si realmente la pides relacionada con Smalltalk, C++ o con OOP-paradigma (teoría) abstraído de cualquier idioma en particular: "Es Python un lenguaje OO puro, es decir, ¿cada tipo (de datos) es un objeto (o una clase de objetos)? http://en.wikipedia.org/wiki/Object-oriented_programming –

Respuesta

58

DiveIntoPython - Everything Is an Object

Everything in Python is an object, and almost everything has attributes and methods. All functions have a built-in attribute __doc__ , which returns the doc string defined in the function's source code. The sys module is an object which has (among other things) an attribute called path. And so forth.

Still, this begs the question. What is an object? Different programming languages define “object” in different ways. In some, it means that all objects must have attributes and methods; in others, it means that all objects are subclassable. In Python, the definition is looser; some objects have neither attributes nor methods (more on this in Chapter 3), and not all objects are subclassable (more on this in Chapter 5). But everything is an object in the sense that it can be assigned to a variable or passed as an argument to a function (more in this in Chapter 4).

Ruby Docs - To Ruby From Python

As with Python, in Ruby,... Everything is an object

Así que ahí lo tienen desde la propia web de Ruby: en Python todo es un objeto.

+2

+1 bien puesto. Como Rubyista, me inclino por el lado del argumento "los objetos deben tener métodos", pero el argumento "todo puede pasar como argumento" está bien planteado (y sospecho que refleja mejor el punto de vista de Pythonista) – rampion

+22

"Pero todo es un objeto en el sentido de que se puede asignar a una variable o pasar como argumento a una función (más en esto en el Capítulo 4) ". Eso no tiene ningún sentido para mí. ¿Eso no haría Java objetos int? –

+1

@JamesMcMahon ¡Sí, tienes razón! ¡La respuesta anterior no respondió la pregunta! Si leemos el [blog] de Guido (http://python-history.blogspot.in/2009/02/first-class-everything.html), dice: 'Una de mis metas para Python era hacer que todo los objetos eran de "primera clase". Con esto, quise decir que quería que todos los objetos que pudieran nombrarse en el lenguaje (por ejemplo, enteros, cadenas, funciones, clases, módulos, métodos, etc.) tuvieran el mismo estatus. Es decir, pueden asignarse a variables, colocarse en listas, almacenarse en diccionarios, pasarse como argumentos, etc. " – overexchange

1

Sí, por lo que sé, todo es un objeto en Python. Ciertamente, los tipos primitivos y integrados (int, long, str, float, etc.) se pueden subclasificar, y de hecho los tipos en sí mismos son objetos. Las funciones son objetos, las clases son objetos, incluso los bloques de códigos son objetos en un sentido ... No se me ocurre nada en Python que no se pueda tratar como un objeto.

+0

es un '# comentario' un objeto? Esto no es una crítica; Sinceramente soy curioso. – ocertat

+1

@ocertat No, al menos no en el sentido que creo que quieres decir. Los comentarios son una característica del código fuente, pero no del programa en sí. Cuando se ejecuta el analizador de Python, simplemente descarta cualquier texto en un comentario y no actúa sobre él.(Sin embargo, hay un analizador de código fuente de Python en la biblioteca estándar, y si lo ejecuta en un archivo de origen con comentarios, puede producir objetos que correspondan a esos comentarios; no lo recuerdo de improviso si lo hace). –

17

En respuesta a su segunda pregunta, sí:

>>> (1).__add__(2) 
3 
+2

Sí. O incluso '1. __add __ (2) '(observe el espacio). Incluso funcionará para flotadores: '1 ..__ add __ (2)'. –

+2

@dF: su primer ejemplo, que utiliza un espacio después de "1.", no funciona para mí en 3.2.3 => SintaxisError: sintaxis no válida –

+0

se supone que el espacio está entre el 1 y el punto: D ' 1 .__ add __ (2) ' –

16

"todo" es un poco de una overbid, tanto para Python y Ruby - por ejemplo, if no es "un objeto", sino que es una palabra clave utilizada para comenzar una declaración condicional o (en Python) dentro de la lista de comprensiones y expresiones del generador. El entusiasmo de descubrir que las funciones, clases, métodos y todo tipo de cosas que no son realmente objetos en (digamos) C++, son objetos en Ruby o Python, causa tal entusiasmo. Otras cosas pueden ser objetos en Ruby pero no Python o viceversa (bloques de código, expresiones regulares, ...).

+1

Sí, pero incluso en smalltalk, donde 'if' es un método de bloqueo (Proc/lambda en ruby, lambdas en python, cierres para tipos independientes del lenguaje), y todo es un objeto, tiene sus palabras clave true, false, nil, self, super y thisContext. Efectivamente, esas son más como pseudovariables ... –

30

Si bien todo es un objeto en Python, difiere de Ruby en su enfoque para resolver nombres e interactuar con objetos.

Por ejemplo, mientras que Ruby le proporciona un método 'to_s' en la clase base del objeto, para exponer esa funcionalidad, Python lo integra al tipo de cadena en sí mismo: convierte un tipo en una cadena mediante la construcción de una cadena de eso. En lugar de 5.to_s, tiene str(5).

No se deje engañar, sin embargo. Todavía hay un método detrás de las escenas - por lo que funciona este código:

(5).__str__() 

Por lo tanto, en la práctica, los dos son fundamentalmente similares, pero que ellos utilizan de manera diferente. La longitud de secuencias como listas y tuplas en Python es otro ejemplo de este principio: la característica real se basa en métodos con nombres especiales, pero expuestos a través de una interfaz más simple y fácil de usar (la función len).

La pitón equivalente a lo que escribió en su pregunta sería entonces:

(5).__add__(6) 

La otra diferencia que es importante es cómo se implementan las funciones globales. En python, los globales están representados por un diccionario (como lo son los locales). Esto significa que el siguiente:

foo(5) 

es equivalente a esto en Python:

globals()["foo"].__call__(5) 

Mientras rubí efectivamente hace esto:

Object.foo(5) 

Esto tiene un gran impacto en el enfoque utilizado cuando escribiendo código en ambos idiomas. Las bibliotecas de Ruby tienden a crecer mediante la adición de métodos a tipos existentes como Object, mientras que las bibliotecas de Python tienden a crecer mediante la adición de funciones globales a un módulo dado.

+0

"Las bibliotecas de Python tienden a crecer mediante la adición de funciones globales a un módulo dado". Esto no es realmente correcto. globals() ["foo"] devuelve un objeto. El __call__ es un método, no una función global. No se puede hacer globals() ["__ call__"] – Unknown

+0

Mi punto es que foo no es un método del módulo. Es un atributo del módulo, que resulta ser invocable, e importarlo también lo agrega a globals(). __call__ es un método, sí. En Ruby, foo es un método de Object, en comparación. –

+2

Estaba tratando de entender por qué puedo hacer "1" .__ eq __ ("2") => Falso, pero no 1 .__ eq __ (2) => SintaxisError: sintaxis no válida. Su respuesta muestra que necesito paréntesis, por ejemplo, (1) .__ eq __ (2). Extrañamente, @ 1 .__ add __ (2) de @ RichieHindle funciona, pero no con un solo período. ¿Por qué es esto? –

0

Para agregar un comentario a las respuestas excelentes de otras personas: todo es un objeto, pero algunas, especialmente las cadenas y los tipos numéricos, son inmutables. Esto significa que estos tipos se comportan de la manera que lo hacen en lenguajes como C o Java (donde los enteros, etc. no son objetos) con respecto a la asignación, el paso de parámetros, etc., y usted nunca tiene que preocuparse por las trampas causadas por el paso referencia. Es una buena solución :-)

Cuestiones relacionadas