2010-07-20 20 views
5

Powiel możliwe:
private members in pythonsymulacji zmiennych prywatnych w Pythonie

ja mam kilka zmiennych naprawdę chcę się ukrywać, bo nie należą one poza moją klasą. Również wszystkie takie nie udokumentowane zmienne czynią dziedziczenie bezużytecznym.

Jak ukryć takie zmienne, których nie chcesz wyświetlać poza obiektem?

Aby wyjaśnić, dlaczego muszę zmiennych prywatnych, pierwszy jeden przykład, w którym niezdolność do ukrycia zmiennych jest tylko niedogodnością, potem drugi, że to naprawdę problem:

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

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

Tak Mam dwa sposoby uzyskania dostępu do „długości "przedmiotu tutaj. To tylko niedogodność i nic strasznego.

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

więc powiedzieć, że chce zmienić wdrożenia pewnego dnia .. Są szanse, będzie to przebić coś chyba mam naprawdę pochowany specyfikę realizacji.

Przyjmę to, jak każdy może zaprogramować. Ten "każdy" może znaleźć użyteczną rzecz z mojej specyfiki implementacji i używać go, nawet jeśli byłbym bardzo zniechęcony do robienia tego! O wiele łatwiej byłoby po prostu powiedzieć: "nie, nie ma go, spróbuj czegoś innego".

+1

Chcesz, aby zmienne nie dziedziczyły, prawda? –

+1

Paul: poprawne. – Cheery

+7

Python nie robi zniewolenia i dominacji jak niektóre języki. Jeśli nie możesz powstrzymać się od używania '_metod' lub' _datum' (patrz DrDee poniżej), zasługujesz na to, co otrzymujesz (lub nie dostaniesz (lub nie złamiesz). – msw

Odpowiedz

14

zmiennych prywatnych jest pokryta w Pythonie documentation:

9.6. Zmienne prywatne

"Prywatne" zmienne instancji, do których nie można uzyskać dostępu, z wyjątkiem wewnątrz obiektu, nie istnieją w języku Python. Istnieje jednak konwencja, po której następuje większość kodu Pythona: nazwa z prefiksem podkreślenia (np. _spam) powinna być traktowana jako niepubliczna część API (bez względu na to, czy jest to funkcja, metoda czy element danych) . Należy go traktować jako szczegół wdrożenia i może ulec zmianie bez powiadomienia.

Podsumowanie: użyj podkreślenia przed nazwą.

11

Z Python docs:

„prywatny” zmienne instancji, które nie mogą być dostępne z wyjątkiem wewnątrz obiektu nie istnieje w Pythonie. Istnieje jednak konwencja, po której następuje większość kodu Pythona: nazwa z prefiksem podkreślenia (np. _spam) powinna być traktowana jako niepubliczna część API (bez względu na to, czy jest to funkcja, metoda czy element danych) . Należy go traktować jako szczegół wdrożenia i może ulec zmianie bez powiadomienia.

+0

mmmmmm 20 sekund za późno :) – DrDee

+0

Jestem prawie pewien, że Mr. Byers żyje w alternatywnym wszechświecie około 10 sekund przed naszym. ;) – msw

+0

ciekawe, meta fizyka w pracy, jak Byers odpowiedział na pytanie zanim to zrobiłem .. – DrDee

Powiązane problemy