2010-07-20 5 views
5

Mögliche Duplizieren:
private members in pythonsimulieren private Variablen in Python

ich einige Variablen habe ich möchte verstecken wirklich, weil sie außerhalb meiner Klasse nicht gehören. Auch alle solche nicht dokumentierten Variablen machen die Vererbung unbrauchbar.

Wie verbergen Sie solche Variablen, die Sie nicht außerhalb Ihres Objekts anzeigen möchten?

Um zu klären, warum ich Variablen private Variablen, zuerst ein Beispiel, wo die Unfähigkeit zu verstecken ist nur eine Unannehmlichkeit, dann eine andere, das ist wirklich ein Problem benötigen:

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

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

So habe ich zwei Möglichkeiten, um den Zugang der Länge 'des Gegenstandes hier. Es ist nur eine Unannehmlichkeit und nichts Schreckliches.

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() 

So sagen, ich will die Umsetzung eines Tages ändern .. Die Chancen sind, es wird etwas brechen, wenn ich wirklich die Umsetzung Besonderheiten begraben haben.

Ich nehme es als jemand programmieren könnte. Dieses "irgendjemand" kann eine nützliche Sache von meinen Implementierungsspezifika finden und sie benutzen, selbst wenn ich davon stark abgeraten hätte! Es wäre viel einfacher zu sagen: "Nein, es ist nicht da, probier etwas anderes."

+1

Sie wollen die Variablen nicht erben, korrigieren? –

+1

Paul: Korrekt .. – Cheery

+7

Python macht keine Knechtschaft und Dominanz wie einige Sprachen. Wenn Sie nicht aufhören können, '_method' oder' _datum' zu verwenden (siehe DrDee unten), verdienen Sie, was Sie bekommen (oder nicht bekommen (oder brechen)). – msw

Antwort

14

private Variablen in dem Python bedeckt documentation:

9,6. Private Variablen

"Private" Instanzvariablen, auf die nur innerhalb eines Objekts zugegriffen werden kann, sind in Python nicht vorhanden. Es gibt jedoch eine Konvention, der der meiste Python-Code folgt: Ein Name, dem ein Unterstrich vorangestellt ist (zB _spam), sollte als nichtöffentlicher Teil der API behandelt werden (unabhängig davon, ob es sich um eine Funktion, eine Methode oder ein Datenelement handelt). . Es sollte als Implementierungsdetail betrachtet und ohne Vorankündigung geändert werden.

Zusammenfassung: Verwenden Sie einen Unterstrich vor dem Namen.

11

Vom Python docs:

„Privat“ Instanzvariablen, die nicht außer aus dem Inneren eines Objekts zugegriffen werden kann, nicht in Python existieren. Es gibt jedoch eine Konvention, der der meiste Python-Code folgt: Ein Name, dem ein Unterstrich vorangestellt ist (zB _spam), sollte als nichtöffentlicher Teil der API behandelt werden (unabhängig davon, ob es sich um eine Funktion, eine Methode oder ein Datenelement handelt). . Es sollte als Implementierungsdetail betrachtet und ohne Vorankündigung geändert werden.

+0

mmmmmm 20 Sekunden zu spät :) – DrDee

+0

Ich bin mir ziemlich sicher, dass Mr. Byers in einem alternativen Universum etwa 10 Sekunden vor uns lebt. ;) – msw

+0

interessant, Metaphysik bei der Arbeit als Byers beantwortete die Frage vor mir .. – DrDee