2011-01-21 16 views
14

Sto cercando di capire un po 'come Python (2.6) si occupa di classe, le istanze e così via, e ad un certo punto, ho provato questo codice:variabili di classe imperative di pitone

#/usr/bin/python2.6 

class Base(object): 
    default = "default value in base" 

    def __init__(self): 
     super(Base, self).__init__() 

    @classmethod 
    def showDefaultValue(cls, defl = default): 
     print "defl == %s" % (defl) 


class Descend(Base): 
    default = "default value in descend" 

    def __init__(self): 
     super(Descend, self).__init__() 

if __name__ == "__main__": 
    Descend.showDefaultValue() 

L'uscita è: "valore predefinito in base"

Mi chiedevo perché il campo "predefinito" non è sovrascritto dalla classe Descend ... C'è un modo per sovrascriverlo? Perché non viene sovrascritto?

Qualsiasi suggerimento (o collegamento a una pagina esplicativa sarà apprezzato). Grazie!

risposta

12

La variabile di classe viene sovrascritta. Prova

@classmethod 
def showDefaultValue(cls): 
    print "defl == %s" % (cls.default,) 

La ragione per la tua strada non funziona ha più a che fare con il modo in cui gli argomenti Python tratta di default a funzioni che con attributi di classe. Il valore predefinito per defl viene valutato al momento in cui Python definisce il binding per showDefaultValue e viene eseguito esattamente una volta. Quando si chiama il metodo, il valore predefinito utilizzato è ciò che è stato valutato al momento della definizione.

Nel proprio caso, defl è stato associato al valore della variabile default come era durante l'esecuzione del modulo corpo classe di Base. Indipendentemente da come si chiama in seguito showDefaultValue (ad esempio, tramite Base o tramite Descend) tale valore rimane fisso in tutte le successive chiamate di showDefaultValue.

12
def showDefaultValue(cls, defl=default): 

significa che default viene valutato quando la funzione è definita, come al solito in Python. Quindi la definizione assomiglia a questo allora:

def showDefaultValue(cls, defl="default value in base"): 

Questo valore di defl viene memorizzato come un argomento di default sull'oggetto funzione ed utilizzata quando si chiama il metodo senza argomenti. È possibile osservare i valori predefiniti di una funzione come print Descend.showDefaultValue.im_self.default per convalidare questo.

Se si desidera ottenere il predefinito dalla classe corrente allora dovete arrivare da lì:

@classmethod 
def showDefaultValue(cls, defl=None): 
    if defl is None: 
     defl = cls.default 
    print "defl == %s" % (defl) 
Problemi correlati