Una cosa importante a tener en cuenta con Python es cuando se ejecutan trozos diferentes de código, junto con el hecho de que las instrucciones class
y def
se ejecutan cuando se ve, no solo se almacena para más adelante. Con un def
que es un poco más fácil de entender, porque lo único que se está ejecutando es lo que está entre los ()
s - por lo que en el código anterior
def __init__(SELF, name = MyClass.__DefaultName):
cuando Python ve MyClass.__DefaultName
se trata de encontrar por primera vez en la local
espacio de nombres , luego el espacio de nombres del módulo (también conocido como global
) y finalmente en builtins
.
¿Qué es el espacio de nombre local
al ejecutar una instrucción class
? Esa es la parte divertida: es lo que se convertirá en el espacio de nombre class
, pero en este momento es anónimo, por lo que no puede hacer referencia por su nombre (MyClass
en su código) pero puede referenciar directamente cualquier cosa que tenga ya se ha definido ... y qué se ha definido? En su clase, solo hay una cosa: __DefaultName
. Por lo que su __init__
debería tener este aspecto:
def __init__(SELF, name=__DefaultName):
Tenga en cuenta que no se puede cambiar MyClass._MyClass__DefaultName
más tarde y tienen esos cambios se muestran en nuevas instancias. ¿Por qué? Debido a que la definición __init__
se ejecuta sólo una vez, y cualquiera que sea el valor __DefaultName
tenían en ese momento se ha guardado y se utilizará siempre - a menos que se especifique directamente un nuevo valor cuando se crea una nueva instancia:
my_instance = MyClass(name='new name')
Asegúrese para leer más allá de la respuesta aceptada menos útil a [la respuesta de Ethan] (http://stackoverflow.com/a/7697664/1709587), que proporciona una sintaxis de trabajo que le permite hacer esto. –