Entero literal es un objeto en Python?

Posible duplicado:
Acceso a los métodos literales de python int.

Todo en Python es un objeto. Incluso un número es un objeto:

>>> a=1 >>> type(a)  >>>a.real 1 

Intenté lo siguiente, porque deberíamos poder acceder a los miembros de la clase de un objeto:

 >>> type(1)  >>> 1.real File "", line 1 1.real ^ SyntaxError: invalid syntax 

¿Por qué esto no funciona?

Sí, un literal entero es un objeto en Python . Para resumir, el analizador necesita poder entender que se trata de un objeto de tipo entero, mientras que la statement 1.real confunde al analizador al pensar que tiene una 1.real flotante 1. seguida de la palabra real , y por lo tanto genera un error de syntax .

Para probar esto también puedes probar

 >> (1).real 1 

tanto como,

 >> 1.0.real 1.0 

así que en el caso de 1.real python está interpretando el . como un punto decimal.

Editar

BasicWolf también lo pone muy bien: 1. se interpreta como la representación de punto flotante de 1, por lo que 1.real es equivalente a escribir (1.)real – por lo tanto, sin operador de acceso de atributo, es decir, punto / parada completa. De ahí el error de syntax.

Edición adicional

Como alude mgilson en su comentario: el analizador puede manejar el acceso a los atributos y métodos de int , pero solo mientras la statement deje en claro que se le está dando un int y no un float .

un lenguaje se suele construir en tres capas.

Cuando proporciona un progtwig a un idioma, primero tiene que “leer” el progtwig. luego construye lo que ha leído en algo con lo que puede trabajar. y finalmente ejecuta esa cosa como “un progtwig” y (con suerte) imprime un resultado.

El problema aquí es que la primera parte de python, la parte que lee los progtwigs, está confundida. está confundido porque no es lo suficientemente inteligente como para saber la diferencia entre

 1.234 

y

 1.letters 

Lo que parece estar sucediendo es que piensa que intentabas escribir un número como 1.234 pero en lugar de eso 1.234 un error y escribiste letras (!).

así que esto no tiene nada que ver con lo que 1 “realmente es” y si es o no un objeto. todo ese tipo de lógica sucede en la segunda y tercera etapas que describí anteriormente, cuando Python intenta construir y luego ejecutar el progtwig.

Lo que has descubierto es solo una arruga extraña (¡pero interesante!) en cómo Python lee los progtwigs.

[Lo llamaría un error, pero probablemente es así por una razón. Resulta que algunas cosas son difíciles de leer para las computadoras. Python probablemente está diseñado para que la computadora pueda leer los progtwigs de manera fácil (rápida). corregir este “error” probablemente haría que la parte de Python que lee los progtwigs sea más lenta o más complicada. así que probablemente es un intercambio.]

Aunque el comportamiento con 1.real parece poco lógico, se espera debido a la especificación del lenguaje: Python interpreta 1. como un flotador (ver literales de punto flotante) . Pero como @mutzmatron señaló (1).real funciona porque la expresión entre paréntesis es un objeto de Python válido.

Actualización: Tenga en cuenta los siguientes hoyos:

 1 + 2j.real >>> 1.0 # due to the fact that 2j.real == 0 # but 1 + 2j.imag >>> 3.0 # due to the fact that 2j.imag == 2 

Todavía puedes acceder a 1.real:

 >>> hasattr(1, 'real') True >>> getattr(1, 'real') 1