2012-08-03 19 views
13

Duplicar posible:
accessing a python int literals methods¿El literal entero es un objeto en Python?

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

>>> a=1 
>>> type(a) 
<class 'int'> 
>>>a.real 
1 

He intentado lo siguiente, porque debemos ser capaces de acceder a miembros de la clase de un objeto:

>>> type(1) 
<class 'int'> 
>>> 1.real 
    File "<stdin>", line 1 
    1.real 
     ^
SyntaxError: invalid syntax 

¿Por qué no funciona?

+3

es un error de sintaxis. el compilador no entiende la sintaxis la sintaxis del lenguaje (su gramática) no está definida para que pueda escribir un nombre de método después de un entero. esto no es un error cuando el programa se ejecuta; es de * antes * de que el programa se ejecute. el analizador no puede entender lo que ha tipeado. –

+0

@andrewcooke - Creo que la pregunta (muy bien demostrado por cierto) es por qué * * no puede manejar el analizador esto? Puede acceder a los atributos/métodos en literales de otros tipos (considere el común '" ".join (...)', ¿por qué no los enteros? – mgilson

+0

lo hace de hecho, pero pensé que la principal preocupación de la persona que hacía la pregunta era que de alguna manera esto significaba que los enteros no eran objetos (ver http://stackoverflow.com/questions/11801549/python-data-types-are-classes-or-data-structures del mismo usuario). De ahí mi énfasis en cómo esto es de una capa separada anterior. –

Respuesta

18

Sí, un entero literal es un objeto en Python. Para resumir, el analizador debe ser capaz de entender que se trata de un objeto de tipo entero, mientras que la declaración 1.real confunde al analizador sintiendo que tiene un flotante 1. seguido de la palabra real, y por lo tanto genera un error de sintaxis.

Para probar esto también se puede tratar

>> (1).real 
    1 

, así como,

>> 1.0.real 
    1.0 

por lo que en el caso de 1.real Python es la interpretación de los . como punto decimal.

Editar

BasicWolf pone muy bien también - 1. se interpreta como la representación de coma flotante de 1, por lo 1.real es equivalente a escribir (1.)real - así sin operador de acceso atributo es decir, periodo/parada completa. De ahí el error de sintaxis.

hacer otras modificaciones

Como mgilson alude a en su/su comentario: el analizador puede manejar el acceso a int 's atributos y métodos, pero sólo mientras la declaración deja claro que se está dando una int y no un float.

+13

'1 .real' también funciona (y' 1..real' para el flotante). –

+6

La razón es que cuando Python ve un número de dígitos y luego un período, lo trata como un punto decimal y espera que sea un flotador. ETA: Bien, llegó a la misma conclusión –

+1

+1, pero es posible que desee agregar una respuesta clara al título confuso: Sí, un literal entero es un objeto; esa no es la razón '1.real' está fallando – abarnert

7

Aunque el comportamiento con 1.real parece ilógico, se espera debido a la especificación del lenguaje: Python interpreta 1. como un flotador (ver floating point literals) Pero como @mutzmatron señaló (1).real obras porque la expresión entre paréntesis es un objeto de Python válida..

Actualizar: Nota los siguientes pozos:

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 
+0

'1 + 2j.real' solo funciona por accidente, es equivalente a' 1 + (2j.real) ', que siempre es igual a' 1 + 0'. –

+0

¡Gracias por complementar a @lazyr! –

2

todavía se puede acceder 1.real:

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

un lenguaje generalmente se construye en tres capas.

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

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

1.234 

y

1.letters 

lo que parece estar sucediendo es que se piensa que estaba tratando de escribir un número como 1.234 pero cometió un error y letras mecanografiadas en su lugar (!).

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 ocurre en la segunda y tercera etapas que describí anteriormente, cuando Python intenta compilar y luego ejecutar el programa.

lo que has descubierto es solo una extraña (¡pero interesante!) Arruga en la forma en que python lee los programas.

[lo llamaría un error, pero probablemente sea así por una razón. resulta que algunas cosas son difíciles de leer para las computadoras. python probablemente está diseñado para que sea fácil (rápido) que la computadora lea programas. arreglar este "error" probablemente haría que la parte de python que lee programas sea más lenta o más complicada. entonces es probable que sea una compensación.]

+0

+1, y un enlace al artículo de Wikipedia sobre [lexing] (http://en.wikipedia.org/wiki/Lexical_analysis), lo que se llama comúnmente ese primer paso. – Izkata

Cuestiones relacionadas