2012-08-03 17 views
13

Eventuali duplicati:
accessing a python int literals methodsIl letterale intero è un oggetto in Python?

tutto in Python è un oggetto. Anche un numero è un oggetto:

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

ho provato quanto segue, perché dovremmo essere in grado di accedere ai membri della classe di un oggetto:

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

Perché questo non funziona?

+3

è un errore di sintassi. il compilatore non capisce la sintassi. la sintassi del linguaggio (la sua grammatica) non è definita in modo che tu possa digitare un nome di metodo dopo un intero. questo non è un errore quando il programma è in esecuzione - è da * prima * che il programma viene eseguito. il parser non riesce a capire cosa hai digitato. –

+0

@andrewcooke - Penso che la domanda (splendidamente dimostrata a proposito) sia * perché * il parser non può gestirlo? È possibile accedere ad attributi/metodi su letterali di altri tipi (si consideri il comune '" ".join (...)', perché non gli interi? – mgilson

+0

lo fa, ma ho pensato che la preoccupazione principale della persona che faceva la domanda era che in qualche modo questo significava che gli interi non erano oggetti (vedi http://stackoverflow.com/questions/11801549/python-data-types-are-classes-or-data-strutture dallo stesso utente), quindi la mia enfasi su come questo è da un livello separato, precedente –

risposta

18

Sì, un numero intero letterale è un oggetto in Python. Per riassumere, il parser deve essere in grado di capire che si tratta di un oggetto di tipo intero, mentre l'istruzione 1.real confonde il parser nel pensare che abbia un float 1. seguito dalla parola real, e quindi solleva un errore di sintassi.

Per testare questo si può anche provare

>> (1).real 
    1 

così come,

>> 1.0.real 
    1.0 

così nel caso di 1.real pitone è interpretare la . come un punto decimale.

Modifica

BasicWolf mette bene troppo - 1. viene interpretata come la rappresentazione in virgola mobile di 1, quindi 1.real equivale a scrivere (1.)real - quindi con nessun attributo operatore di accesso cioè periodo/fermo. Da qui l'errore di sintassi.

Ulteriori modifica

Come mgilson allude nella sua/suo commento: il parser in grado di gestire l'accesso a int s' attributi e metodi, ma solo finché la dichiarazione chiarisce che esso viene dato un int e non uno float.

+13

'1 .real' funziona anche (e' 1..realistico 'per il float.) –

+6

Il motivo è che quando Python vede un numero di cifre e quindi un punto, lo considera come un ETA: Giusto, sei arrivato alla stessa conclusione –

+1

+1, ma potresti voler aggiungere una risposta chiara al titolo confuso: Sì, un intero letterale è un oggetto, non è questo il motivo '1.real' sta fallendo – abarnert

7

Anche se il comportamento con 1.real sembra illogiche, si prevede a causa della specifica del linguaggio: Python interpreta 1. come un galleggiante (vedi floating point literals) Ma, come ha sottolineato @mutzmatron (1).real lavori perché l'espressione tra parentesi è un oggetto Python valida..

aggiornamento: fare attenzione ai seguenti box:

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' funziona solo per errore, è equivalente a' 1 + (2j.real) ', che è sempre uguale a' 1 + 0'. –

+0

Grazie, per aver completato @lazyr! –

2

È ancora possibile accedere 1.real:

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

una lingua di solito è composta da tre livelli.

quando si fornisce un programma a una lingua prima deve "leggere" il programma. poi costruisce ciò che ha letto in qualcosa con cui può funzionare. e infine esegue quella cosa come "un programma" e (si spera) stampa un risultato.

il problema qui è che la prima parte di python - la parte che legge i programmi - è confusa. è confuso perché non è abbastanza intelligente da sapere la differenza tra

1.234 

e

1.letters 

quello che sembra accadere è che si pensa si stava tentando di digitare un numero come 1.234 ma commesso un errore e lettere digitate invece (!).

quindi questo non ha nulla a che fare con ciò che 1 "è veramente" e se è o meno un oggetto. tutto quel tipo di logica avviene nel secondo e nel terzo stadio che ho descritto in precedenza, quando python tenta di compilare e quindi eseguire il programma.

quello che hai scoperto è solo una strana (ma interessante!) Ruga in come Python legge i programmi.

[lo definirei un errore, ma probabilmente lo è per una ragione. si scopre che alcune cose sono difficili da leggere per i computer. python è probabilmente progettato in modo che sia facile (veloce) per il computer leggere i programmi. risolvere questo "bug" probabilmente renderebbe la parte di python che legge i programmi più lentamente o più complicati. quindi è probabilmente un trade-off.]

+0

+1 e un collegamento all'articolo di Wikipedia su [lexing] (http://en.wikipedia.org/wiki/Lexical_analysis), che cosa viene comunemente chiamato il primo passo. – Izkata

Problemi correlati