Domanda

Sono abbastanza nuovo per linguaggi di programmazione effettivi, e Python è il mio primo. So che il mio modo per aggirare Linux un po ', abbastanza per ottenere un lavoro estivo con esso (io sono ancora al liceo), e sul posto di lavoro, ho un sacco di tempo libero, che sto usando per imparare Python.

Una cosa è stato mi ha sempre però. Che cosa è esattamente diverso in Python quando si dispone di espressioni come

x.__add__(y) <==> x+y
x.__getattribute__('foo') <==> x.foo

So quello che fanno e metodi di roba, e ottengo quello che fanno, ma la mia domanda è: Come sono quei metodi doppia sottolineatura sopra diversi dai loro equivalenti in cerca più semplici

P.S., Non mi importa di essere tenuto conferenze sulla programmazione storia, infatti, lo trovo molto utile per sapere :) Se questi sono aspetti prevalentemente storiche della Python, sentitevi liberi di iniziare vagante.

È stato utile?

Soluzione

Bene, il potere per il programmatore è buono, quindi ci dovrebbe essere un modo per comportamento personalizzazione. Come sovraccarico operator (__add__, __div__, __ge__, ...), accesso agli attributi (__getattribute__, __getattr__ (quei due sono differente), __delattr__, ...), ecc In molti casi, come operatori, la solita sintassi mappe 1: 1 al rispettivo metodo. In altri casi, v'è un procedimento speciale che ad un certo punto coinvolge chiamare il rispettivo metodo - per esempio, __getattr__ viene chiamato solo se l'oggetto non ha l'attributo richiesto e __getattribute__ non viene attuato o AttributeError sollevata. E alcuni di loro sono argomenti molto avanzati che porterà deeeeep nella viscere del sistema oggetto e sono raramente necessari. Quindi non c'è bisogno di imparare tutti, basta consultare il riferimento quando si ha bisogno / vuoi sapere. Parlando di riferimento, qui è .

Altri suggerimenti

Ecco il creatore di Python spiegarla :

  

... piuttosto che elaborare una nuova sintassi per   particolari tipi di metodi di classe (ad esempio   come inizializzatori e distruttori), I   hanno deciso che queste caratteristiche potrebbero essere   gestito semplicemente richiedendo all'utente   per implementare metodi con particolare   nomi come __init__, __del__, e   così via. Questa convenzione di denominazione è stato   prelevato da C dove identificatori   iniziando con sottolineature sono riservati   dal compilatore e spesso hanno speciali   significato (ad esempio, le macro come   __FILE__ nel preprocessore C).

...

  

Inoltre ho usato questa tecnica per consentire   classi utente ridefinire il comportamento   degli operatori di Python. Come in precedenza   notato, Python è implementato in C e   utilizza le tabelle di puntatori a funzione per   implementare varie capacità di   oggetti incorporati (ad esempio, “get   attributo”,‘Aggiungi’e‘chiamata’). A   permettere a queste funzionalità da definire   in classi definite dall'utente, ho mappato il   vari puntatori a funzione a speciale   i nomi dei metodi, come __getattr__,   __add__ e __call__. C'è un   corrispondenza diretta tra questi   i nomi e le tavole di funzione   puntatori si deve definire quando   attuazione nuovo pitone oggetti in C.

Quando si avvia un metodo con due underscore (e nessun sottolineatura finale), di Python nome pressare regole vengono applicate. Questo è un modo per simulare vagamente la parola private da altri linguaggi OO come C ++ e Java. (Anche così, il metodo è ancora tecnicamente non è privato nel modo in cui i metodi Java e C ++ sono private, ma è "più difficile da ottenere a" dall'esterno l'istanza.)

Metodi con due principali e due trailing sottolineature sono considerati essere "built-in" metodi, cioè, vengono usati dall'interprete e sono generalmente le implementazioni concrete degli operatori di overload o altre funzionalità built-in.

Sono utilizzati per specificare che l'interprete Python li deve utilizzare in situazioni specifiche.

per es., La funzione __add__ permette all'operatore + al lavoro per classi personalizzate. In caso contrario, si otterrà una sorta di errore non definita quando si tenta di aggiungere.

Dal punto di vista storico, che portano sottolineature sono state spesso utilizzate come un metodo per indicare al programmatore che i nomi sono da considerarsi interno al pacchetto / modulo / libreria che li definisce. In lingue che non forniscono un buon supporto per i namespace private, utilizzando sottolineatura è una convenzione di emulare questo. In Python, quando si definisce un metodo chiamato '__foo__' il programmatore di manutenzione conosce dal nome che qualcosa di speciale sta succedendo, che non sta accadendo con un metodo chiamato 'foo'. Se Python aveva scelto di utilizzare 'Add' come il metodo interno di un sovraccarico '+', allora si potrebbe mai avere una classe con un metodo 'Add' senza causare molta confusione. Le sottolineature servono come spunto che qualche magia accadrà.

Un certo numero di altre questioni sono ora contrassegnati come duplicati di questa domanda, e almeno due di loro chiedere che cosa sia i metodi __spam__ sono chiamati, o ciò che la convenzione si chiama, e nessuna delle risposte esistenti coprono che, così:

Non è in realtà un nome ufficiale per entrambi.

Molti sviluppatori ufficiosamente li chiamano "metodi Dunder", per "doppio underscore".

Alcune persone usano il termine "metodi magici", ma questo è un po 'ambigua tra significato metodi Dunder, metodi speciali (vedi sotto), o qualcosa da qualche parte tra i due.


è un termine ufficiale "attributi speciali", che si sovrappone a stretto contatto, ma non del tutto con i metodi Dunder. Il Data Model capitolo nel riferimento mai del tutto spiega che cosa un attributo speciale è, ma l'idea di base è che è almeno una delle seguenti condizioni:

  • Un attributo che è fornito dall'interprete stessa o il suo codice incorporato, come __name__ su una funzione.
  • attributo Una parte di un protocollo implementato dall'interprete stessa, come __add__ per l'operatore +, o __getitem__ per l'indicizzazione e affettamento della.
  • Un attributo che l'interprete è permesso di guardare in alto appositamente, ignorando l'istanza e andando a destra alla classe, come __add__ di nuovo.

La maggior parte delle attributi speciali sono metodi, ma non tutti (per esempio, non è __name__). E la maggior parte usano il "Dunder" convenzione, ma non tutti (per esempio, il metodo next su iteratori in Python 2.x).

E nel frattempo, la maggior parte dei metodi di Dunder sono attributi speciali, ma non tutti, in particolare, non è raro che per stdlib o librerie esterne a voler definire i propri protocolli che funzionano allo stesso modo, come il pickle protocollo

[Speculazione] Python è stato influenzato da Algol68 , Guido eventualmente utilizzato Algol68 al Università di Amsterdam dove Algol68 ha un simile " stropping regime " chiamato "Citazione raddrizzatura". In Algol68 gli operatori, i tipi e le parole chiave possono visualizzato in un carattere diverso (di solito ** grassetto **, o __ sottolineato __), nei file dei sorgenti questo carattere si ottiene con le virgolette, ad esempio, 'Abs' (citando simile a citare in ' wikitext ')

Algol68 ⇒ Python (Operatori mappati funzioni membro)

  • 'e' ⇒ __and __
  • 'o' ⇒ __or __
  • 'non e' ⇒ non
  • 'entier' ⇒ __trunc __
  • 'shl' ⇒ __lshift __
  • 'SHR' ⇒ __rshift __
  • 'UPB' ⇒ __sizeof __
  • 'lungo' ⇒ __long __
  • 'int' ⇒ __int __
  • 'reale' ⇒ __float __
  • 'format' ⇒ __format __
  • 'repr' ⇒ __repr __
  • 'abs' ⇒ __abs __
  • 'minus' ⇒ __neg __
  • 'minus' ⇒ __sub __
  • 'plus' ⇒ __add __
  • 'volte' ⇒ __mul __
  • 'mod' ⇒ __mod __
  • 'div' ⇒ __truediv __
  • 'over' ⇒ __div __
  • 'up' ⇒ __pow __
  • 'im' ⇒ imag
  • 're' ⇒ reale
  • 'conj' ⇒ coniugato

In Algol68 questi sono stati riferisce a come nomi in grassetto , per esempio ABS , ma "sotto-sotto-abs" __abs__ in Python.

I miei 2 centesimi: ¢ Così a volte - come un fantasma - quando si taglia e incolla classi Python in un wiki si magicamente reincarnarsi di Algol68 grassetto le parole chiave. ¢

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top