2010-07-20 12 views
5

Eventuali duplicati:
private members in pythonsimulare le variabili private in python

Ho alcune variabili voglio davvero nascondere, perché non appartengono al di fuori la mia classe. Inoltre tutte queste variabili non documentate rendono l'ereditarietà inutile.

Come si nascondono tali variabili che non si desidera mostrare all'esterno del proprio oggetto?

Per chiarire il motivo per cui ho bisogno di variabili private, primo esempio in cui l'incapacità di nascondere le variabili è solo un inconveniente, poi un altro che è davvero un problema:

class MyObject(object): 
    def __init__(self, length): 
     self.length = length 
    def __len__(self): 
     return length 

item = MyObject(5) 
item.length 
len(item) 

Così ho due modi per accedere 'lunghezza 'dell'articolo qui. È solo un inconveniente e niente di orribile.

from wares import ImplementationSpecific 

class MyThing(object): 
    def __init__(self): 
     self.__no_access_even_if_useful = ImplementationSpecific() 
    def restricted_access(self): 
     return self.__no_access_even_if_useful.mutable_value 

thing = MyThing() 
thing.restricted_access() 
thing._MyThing__no_access_even_if_useful.something_useful_for_someone() 

Quindi dire che voglio cambiare l'implementazione qualche giorno .. Le probabilità sono che sarà rompere qualcosa a meno che non ho davvero sepolto le specifiche di implementazione.

Lo prenderò come chiunque potrebbe programmare. Quel "chiunque" può trovare una cosa utile dalle mie specifiche di implementazione e usarla, anche se mi dispiacerebbe fortemente di farlo! Sarebbe molto più facile dire semplicemente: "no, non c'è, prova qualcos'altro".

+1

Si desidera che le variabili non ereditino, correggere? –

+1

Paul: corretto .. – Cheery

+7

Python non esegue bondage e dominazione come fanno alcune lingue. Se non riesci a smettere di usare '_method' o' _datum' (vedi DrDee sotto) ti meriti quello che ottieni (o non ottieni (o interrompi)). – msw

risposta

14

variabili private rientra nel Python documentation:

9,6. Variabili private

Le variabili di istanza "private" a cui non è possibile accedere tranne all'interno di un oggetto non esistono in Python. Tuttavia, esiste una convenzione seguita dalla maggior parte del codice Python: un nome preceduto da un carattere di sottolineatura (ad esempio _spam) deve essere considerato come una parte non pubblica dell'API (indipendentemente dal fatto che si tratti di una funzione, un metodo o un membro dati) . Dovrebbe essere considerato un dettaglio di implementazione e soggetto a modifiche senza preavviso.

Riepilogo: utilizzare un trattino di sottolineatura prima del nome.

11

Dal Python docs:

“Private” variabili di istanza che non è possibile accedere se non da all'interno di un oggetto non esistono in Python. Tuttavia, esiste una convenzione seguita dalla maggior parte del codice Python: un nome preceduto da un carattere di sottolineatura (ad esempio _spam) deve essere considerato come una parte non pubblica dell'API (indipendentemente dal fatto che si tratti di una funzione, un metodo o un membro dati) . Dovrebbe essere considerato un dettaglio di implementazione e soggetto a modifiche senza preavviso.

+0

mmmmmm 20 secondi troppo tardi :) – DrDee

+0

Sono abbastanza sicuro che Mr. Byers viva in un universo alternativo a circa 10 secondi prima del nostro. ;) – msw

+0

interessante, meta fisica al lavoro come Byers ha risposto alla domanda prima di me .. – DrDee

Problemi correlati