2011-01-09 11 views
8

Czy istnieje sposób na zachowanie prywatnej zmiennej klasy w klasie i nadal używać jej jako wartości domyślnej dla zmiennej innej niż domyślna (bez definiowania tej wartości wcześniej, poza klasa)?Używanie zmiennej klasy jako niestandardowego argumentu w pytonie

przykład:

class a: 
    def __init__(self): 
     self.__variable = 6 
    def b(self, value = self.__variable): 
     print value 
+5

Python robi ** ** nie ma zmiennych prywatnych klasy. W ogóle. Podwójne podkreślenie, którego używasz, nie ** powoduje, że zmienna jest prywatna, po prostu łamie nazwę, aby uniknąć kolizji nazw. Nie używaj podwójnych podkreśleń, chyba że wiesz, dlaczego musisz. ;) –

+0

Świetne pytanie! (Cóż, to rozwiązało ogromny problem, który miałem, więc ...) – nchpmn

Odpowiedz

14

Ty overthinking problem:

class a: 

    def __init__(self): 
     self.__variable = 6 

    def b(self, value=None): 
     if value is None: 
      value = self.__variable 
     print value 
+0

wow. zawodzę. dzięki! – calccrypto

4
  1. self.__variable jest zmienną instancji, a nie zmienna klasa.
  2. Ponieważ domyślne argumenty są wyceniane funkcja metoda czasu definicji, nie można użyć zmiennej instancji jako domyślny argumentu - przynajmniej nie bezpośrednio (zwykłe sztuczki, zalegających na None i dodanie if arg is None: arg = real_default do ciała funkcji, działa).
  3. Czołowe podwójne podkreślenia nie oznaczają "prywatne", oznaczają "wymamrotanie nazwy i żądanie kłopotów". Jeśli nie wiesz dokładnie, co mam na myśli, nie powinieneś używać tej "funkcji" w ogóle. Zamierzone użycie to nie członków prywatnych - użyj jednego znaku podkreślenia.
+0

Co zatem, ** jest ** zamierzonym użyciem? –

+1

@Karl: Zapobieganie konfliktom nazw w podklasach. Zobacz np. http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers lub http://docs.python.org/tutorial/classes.html?highlight=mangling#private-variables (trzeci akapit). – delnan

+0

i nadal mogę uzyskać dostęp do zmiennych, jeśli używam tylko 1 podkatalogu – calccrypto

3

Warto dodać, że można utworzyć niestandardową wartość sentinalną, która nie zostanie użyta do żadnego innego celu w kodzie, jeśli chcesz, aby None znajdował się w zakresie dozwolonych argumentów. Bez tego, value, None nigdy nie może zostać zwrócony z b.

UseDefault = object() 

# Python 3? Otherwise, you should inherit from object unless you explicitly 
# know otherwise. 
class a:  
    def __init__(self): 
     self._variable = 6 

    def b(self, value=UseDefault): 
     if value is UseDefault: 
      value = self._variable 
     print value 

Teraz None mogą być przekazywane do b bez powodowania domyślne być used.`