2011-01-21 9 views
14

estoy tratando de entender un poco cómo Python (2.6) se ocupa de las clases, instancias y así sucesivamente, y en un momento dado, me probado este código:variables de clase imperiosas de pitón

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

La salida es: "valor predeterminado en la base"

Me preguntaba por qué el campo "predeterminado" no está sobrecomerdado por la clase Descend ... ¿Hay alguna manera de sobrescribirlo? ¿Por qué no se sobrescribe?

Cualquier sugerencia (o enlace a una página explicativa será apreciada). ¡Gracias!

Respuesta

12

La variable de clase se sobrescribe. Trate

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

La razón de su forma no funciona tiene más que ver con los argumentos trata de Python por defecto de forma en las funciones que con los atributos de clase. El valor predeterminado para defl se evalúa en el momento en que Python define el enlace para showDefaultValue y esto se hace exactamente una vez. Cuando llama a su método, el valor predeterminado utilizado es el que se evaluó en el momento de la definición.

En su caso, defl estaba relacionado con el valor de la variable default tal como estaba durante la ejecución del formulario del cuerpo de clase de Base. Independientemente de cómo llame al showDefaultValue más tarde (es decir, ya sea a través de Base o a través de Descend) ese valor permanece fijo en todas las invocaciones posteriores de showDefaultValue.

12
def showDefaultValue(cls, defl=default): 

significa que default se evalúa cuando se define la función, como es habitual en Python. Así, la definición se parece a esto, entonces:

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

Este valor de defl se almacena como un argumento por defecto en el objeto y la función utilizada cuando se llama al método sin argumentos. Puede ver los valores predeterminados de una función como print Descend.showDefaultValue.im_self.default para validar esto.

Si desea obtener el valor por defecto de la clase actual, entonces usted tiene que conseguir a partir de ahí:

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