2011-01-09 5 views
8

esiste un modo per mantenere una variabile di classe privata all'interno della classe e comunque utilizzarla come valore predefinito su una variabile non predefinita (senza definire tale valore prima, all'esterno del valore classe)?Utilizzo della variabile di classe come argomento non predefinito in python

esempio:

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

Python ha ** ** avere variabili di classe private. Affatto. La doppia sottolineatura che stai usando fa ** non ** rende la variabile privata, ma solo il nome mangling per evitare conflitti di nome. Non utilizzare caratteri di sottolineatura doppio a meno che non si sappia il motivo per cui è necessario. ;) –

+0

Ottima domanda! (Beh, ha risolto un grosso problema che avevo, quindi ...) – nchpmn

risposta

14

sei overthinking il problema:

class a: 

    def __init__(self): 
     self.__variable = 6 

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

wow. fallisco. Grazie! – calccrypto

4
  1. self.__variable è una variabile di istanza, non è una variabile di classe.
  2. Poiché gli argomenti predefiniti vengono valutati in funzione metodo volta definizione, non è possibile utilizzare una variabile di istanza come argomento di default - almeno non direttamente (il solito trucco, inadempiente a None e aggiungendo if arg is None: arg = real_default al corpo della funzione, funziona).
  3. I primi caratteri di sottolineatura non significano "privato", significano "nome manchiamento e richiesta di problemi". Se non sai esattamente cosa intendo, non dovresti usare questa "caratteristica". L'uso previsto è non membri privati ​​- utilizzare un carattere di sottolineatura per quello.
+0

Cosa, quindi, ** è ** l'uso previsto? –

+1

@Karl: prevenzione del conflitto di nomi nelle sottoclassi. Vedi per es. http://docs.python.org/reference/lexical_analysis.html#reserved-classes-of-identifiers o http://docs.python.org/tutorial/classes.html?highlight=mangling#private-variables (terzo paragrafo). – delnan

+0

posso ancora accedere alle variabili se utilizzo solo 1 sottoscreen – calccrypto

3

Vale la pena aggiungere a questo che è possibile creare un valore nominale personalizzato che non viene utilizzato per altri scopi nel codice se si desidera che None sia compreso nell'intervallo di argomenti consentiti. Senza fare ciò, value, None non può mai essere restituito da 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 

Ora None possono essere passati al b senza causare il default da non used.`