Pregunta

Por qué tal estructura

class A:
    def __init__(self, a):
        self.a = a

    def p(self, b=self.a):
        print b

da un error NameError: el nombre 'self' no está definido ?

¿Fue útil?

Solución

Los valores de argumento predeterminados se evalúan en el momento de definición de la función, pero self es un argumento solo disponible en el momento de la llamada a la función. Por lo tanto, los argumentos en la lista de argumentos no pueden referirse entre sí.

Es un patrón común predeterminar un argumento para None y agregar una prueba para eso en el código:

def p(self, b=None):
    if b is None:
        b = self.a
    print b

Otros consejos

Para los casos en los que también desea tener la opción de configurar 'b' en Ninguno:

def p(self, **kwargs):
    b = kwargs.get('b', self.a)
    print b

Si ha llegado aquí a través de google, asegúrese de comprobar que se ha dado a sí mismo como primer parámetro para una función de clase. Especialmente si intenta hacer referencia a valores para ese objeto dentro de la función.

def foo():
    print(self.bar)

> NameError: el nombre 'self' no está definido

def foo(self):
    print(self.bar)

> " ¡Felicidades por haber eliminado NameError! "

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top