2011-10-05 30 views
5

Ostatnio opublikowałem a question na stackoverflow i dostałem postanowienie.Jaki jest Pythonowy sposób korzystania ze zmiennych prywatnych?

Jedna osoba zasugerowała mi styl kodowania i nie otrzymałem dalszych informacji. Mam następujące pytanie w odniesieniu do poprzedniego zapytania.

  1. Jak zadeklarować prywatne zmienne wewnątrz klasy w python? Pomyślałem, że używając podwójnego podkreślenia (__) zmienna jest traktowana jako prywatna. Proszę mnie poprawić.

  2. Zgodnie z sugestią otrzymaną wcześniej, nie musimy używać metody gettera lub setera. Czy nie powinniśmy użyć gettera lub setera albo obu? Daj mi znać swoją sugestię na ten temat.

+1

Odpowiedź # 1, nie ma prawdziwych zmiennych prywatnych w Pythonie. Zobacz: [this] (http://stackoverflow.com/questions/70528/why-are-pythons-private-methods-not-actually-private) i [this] (http://stackoverflow.com/questions/7456638/true-privateness-in-python/7456669 # 7456669) – NullUserException

+1

http://dirtsimple.org/2004/12/python-is-not-java.html – SingleNegationElimination

Odpowiedz

8

Wszystko jest public w Pythonie The __ jest sugestia umownie, że nie należy korzystać z tej funkcji, ponieważ jest szczegółów wdrażania.

To nie jest wymuszane przez język lub środowisko wykonawcze w jakikolwiek sposób, nazwy te są udekorowane w sposób częściowo zaciemniony, ale nadal są one widoczne dla wszystkich kodów, które próbują z nich korzystać.

Idiomatic Python nie używa get/set accessors, jest to duplikacja wysiłku, ponieważ nie ma zasięgu private.

Używacie akcesorów tylko wtedy, gdy chcecie uzyskać pośredni dostęp do zmiennej składowej, aby mieć wokół niej kod, a następnie oznaczyć zmienną składową jako __ jako początek jej nazwy i podać funkcję z aktualną nazwą.

Możesz poczynić duże starania, pisząc rozdziały kodu, próbując zabezpieczyć użytkownika przed samym sobą za pomocą Descriptors i meta-programowania, ale w końcu skończy ci się więcej kodu, który jest bardziej do przetestowania i więcej do utrzymania, i wciąż nie ma gwarancji, że złe rzeczy się nie wydarzą, nie martw się o to, Python przetrwał w tej chwili 20 lat, więc nie może to być tak wielka sprawa.

+0

Dzięki Jarrod. Jeśli nie możemy przypisać zmiennej prywatnej, w jaki sposób możemy egzekwować reguły takie jak zmienna nie powinny otrzymywać niedopuszczalnych wartości. – techrawther

+0

Naprawdę nie możesz tego wymusić. Jeśli chcą uzyskać do niego dostęp, będą. Podwójny podkreślnik po prostu próbuje zaciemnić go, jak generuje nazwę, gdy patrzysz na atrybuty spoza klasy – jdi

+0

Istnieje kilka [technik programowania meta] (http://www.acooke.org/cute/PythonMeta0.html), które możesz użyć do przechwycenia dostępu do zmiennych członkowskich, ale szczerze mówiąc, w ciągu 15 lat programowania w Pythonie nigdy nie było mi to przeszkodą, czy reszta świata naprawdę. –

0

zmienne prywatne:

przypadku korzystania z podwójnego podkreślenia na początku swoich członków klasy są one uważane za prywatne, choć tak naprawdę nie egzekwowane przez pytona. Po prostu narzucają imiona z przodu, aby uniemożliwić łatwy dostęp do nich. Jedno podkreślenie można potraktować jako "chronione".

Getter/Ustawiacz:

Można z nich korzystać, jeśli chcesz zrobić więcej, by zakończyć proces i „chronić” swój „prywatny” atrybutów. Ale to znowu nie jest wymagane. Możesz także użyć właściwości, które ma funkcje getter/setter.

0

1) http://docs.python.org/tutorial/classes.html#private-variables

„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.

(dalej czytać więcej szczegółów na temat zmiennych klasowych-prywatnego i nazwa przekręcona)

2) http://docs.python.org/library/functions.html#property

4

PEP 8 (http://www.python.org/dev/peps/pep-0008/) posiada sekcję "Projektowanie dla dziedziczenia", która powinna zająć większość te obawy.

Cytując:

„Nie stosujemy termin«prywatny»tutaj, ponieważ żaden atrybut jest naprawdę prywatne w Pythonie (bez ogół niepotrzebne ilości pracy).”

również:

„Jeśli klasa jest przeznaczona do podklasy i masz atrybuty że nie chcesz podklasy użyć, należy rozważyć nazywając je podwójnych wiodących podkreślenia i nie krocząca podkreśla”

Jeśli nie przeczytałeś całej sekcji, zachęcam Cię do zrobienia tego.

Aktualizacja:

Aby odpowiedzieć na pytanie (teraz, że tytuł został zmieniony). Pythoniczny sposób używania zmiennych prywatnych to: , a nie użycie zmiennych prywatnych. Próbowanie ukrywania czegoś w pytonie jest rzadko postrzegane jako pyton.

Powiązane problemy