Usando self. * Como valor predeterminado para un método

def save_file(self, outputfilename = self.image_filename): self.file.read(outputfilename) .... 

da NameError: name 'self' is not defined en la primera línea. Parece que Python no lo acepta. ¿Cómo puedo reescribir el código para que no genere una excepción?

Utilice un valor predeterminado de None y detecte eso.

 def save_file(self, outputfilename=None): if outputfilename is None: outputfilename = self.image_filename self.file.read(outputfilename) .... 

La documentación establece:

Los valores predeterminados de los parámetros se evalúan cuando se ejecuta la definición de la función.

Esto explica por qué no se puede hacer referencia a la instancia. Como han dicho otros, use Ninguno como su valor predeterminado y corrija el valor en el momento de ejecución de la función cuando la instancia esté disponible.

 def save_file(self, outputfilename = None): if not outputfilename: outputfilename = self.image_filename self.file.read(outputfilename) .... 
 def save_file(self, outputfilename=None): outputfilename = outputfilename or self.image_filename self.file.read(outputfilename) 

o incluso

 def save_file(self, outputfilename=None): self.file.read(outputfilename or self.image_filename) 

Puede que no sea nada con una variable, pero si tiene, digamos, 5, esto hace que el código sea más fácil de leer, en mi opinión.