Daten verbergen in Python-Klasse

8

Ich weiß, dass die Attribute der Klasse, die mit dem doppelten Unterstrich __ Präfix deklariert sind, auch außerhalb der Klassendefinition sichtbar sein können. Da wir immer noch auf diese Attribute von object._className__attrName zugreifen können.

%Vor%

Um nun alle Attribute außer dem Attribut catch zu schützen, muss ich sie mit doppeltem Unterstrich deklarieren, was ziemlich unordentlich ist. Kann ich in meiner Klassendefinition sagen, dass nur auf self.catch außerhalb der Klasse zugegriffen werden kann?

Entschuldigung, falls das irgendwo anders beantwortet oder besprochen wird.

    
Aamir Adnan 26.01.2012, 20:41
quelle

4 Antworten

16

Ja, es ist möglich, private Daten in einem Closure zu verstecken - zumindest, wenn es eine Möglichkeit gibt, auf private von außerhalb von make_A zuzugreifen, habe ich es nicht gefunden:

%Vor%

Beachten Sie, dass private nicht in dir(a)

ist %Vor%

Obwohl dies möglich ist, halte ich das nicht für eine empfehlenswerte Methode in Python zu programmieren.

Oben wird private von allen Instanzen von A geteilt. Um private Daten pro Instanz zu verwenden, fügen Sie self zum dict key hinzu:

%Vor%     
unutbu 26.01.2012, 20:59
quelle
3

Während die akzeptierte Antwort von unutbu eine gute Idee zum Ausblenden von Daten darstellt, ist das private -Wörterbuch weiterhin mit __closure__ verfügbar (dieses Attribut kann nicht entfernt werden):

%Vor%

Oder folgen Sie dem Link von Sumukh Barve in den Kommentaren:

%Vor%

Die einzige Möglichkeit zum Erstellen von private Attributen besteht darin, eine Art CPython Erweiterung zu schreiben.

    
Ceppo93 21.11.2016 18:03
quelle
1

Nein, da es Teil des Namens ist, können Sie das nicht tun.

Nun, eigentlich kannst du das mit den Gettern / Settern hacken, aber das solltest du generell nicht tun.

    
Teo Klestrup Röijezon 26.01.2012 20:45
quelle
1

Warum möchten Sie vielleicht Attribute schützen?

Wenn Sie Attribute vor unbeabsichtigtem Überschreiben schützen möchten, verwenden Sie doppelte Unterstriche und wahrscheinlich nur Ready-Only-Eigenschaften, um den Zugriff zu erleichtern. Aber die meiste Zeit, du wirst es nicht brauchen . Tun Sie sich selbst einen Gefallen und lassen Sie die Attribute offen, dies erleichtert das Debuggen erheblich.

Wenn Sie Ihr Objekt vor Manipulationen durch Dritte schützen möchten, können Sie mit __getattr__ und __setattr__ spielen, aber wahrscheinlich sollten Sie keine nicht vertrauenswürdigen Client-Objekte mit geschützten Daten übergeben. Verwenden Sie dazu die Fassadenmuster und verstecken Ihre Wertsachen undurchsichtiger. Vielleicht möchten Sie auch Ihre Architektur überdenken.

    
9000 26.01.2012 21:04
quelle

Tags und Links