Usando la variable de clase como argumento no predeterminado en Python

¿Hay alguna manera de mantener una variable de clase privada dentro de la clase y seguir utilizándola como valor predeterminado para una variable no predeterminada (sin definir ese valor antes, fuera de la clase)?

ejemplo:

class a:
    def __init__(self):
        self.__variable = 6
    def b(self, value = self.__variable):
        print value

preguntado el 09 de enero de 11 a las 06:01

Python hace no es tener variables de clase privadas. En absoluto. El doble subrayado que está utilizando no no es hacer que la variable sea privada, simplemente modifica los nombres para evitar conflictos de nombres. No use guiones bajos dobles a menos que sepa por qué tiene que hacerlo. ;) -

¡Gran pregunta! (Bueno, resolvió un gran problema que tenía, así que ...) -

3 Respuestas

Estás pensando demasiado en el problema:

class a:

    def __init__(self):
        self.__variable = 6

    def b(self, value=None):
        if value is None:
            value = self.__variable
        print value

Respondido el 09 de enero de 11 a las 09:01

  1. self.__variable es una variable de instancia, no una variable de clase.
  2. Debido a que los argumentos predeterminados se evalúan en funcióntiempo de definición del método, no puede usar una variable de instancia como argumento predeterminado, al menos no directamente (el truco habitual, por defecto None y añadiendo if arg is None: arg = real_default al cuerpo de la función, funciona).
  3. Los guiones bajos dobles iniciales no significan "privado", significan "alterar nombres y buscar problemas". Si no sabe exactamente a qué me refiero, no debería utilizar esta "función" en absoluto. El uso previsto es no es miembros privados: use un guión bajo para eso.

Respondido el 09 de enero de 11 a las 09:01

Entonces que, is el uso previsto? - Karl Knechtel

@Karl: Prevención de conflictos de nombres en subclases. Ver por ejemplo docs.python.org/reference/… or docs.python.org/tutorial/… (tercer párrafo). - usuario395760

Todavía puedo acceder a las variables si uso solo 1 subpuntaje - calcrypto

@calccrypto: Sí, por supuesto. ¿Por qué no? En realidad, lo contrario es cierto: no se puede acceder con cordura __variable en cualquier lugar fuera de la definición de la clase (debido a la alteración de nombres). Es por eso que le sugiero que deje un guión bajo. - usuario395760

@calccrypto sí, está bien. Python se basa en la suposición de que todos somos adultos y entendemos que acceder a las variables de otra clase, sin permiso explícito (de la documentación de esa clase), es malo. (E incluso entonces, en lugar de simplemente otorgar permiso, tenemos property envoltorios ahora.) Si quisiera ese nivel de verificación en tiempo de compilación, no estaría usando un lenguaje escrito dinámicamente. - Karl Knechtel

Vale la pena agregar a esto que puede crear un valor sentinal personalizado que no se use para ningún otro propósito en su código si lo desea None estar en el rango de argumentos permitidos. Sin hacer esto, value, None nunca se puede devolver de b.

UseDefault = object()

# Python 3? Otherwise, you should inherit from object unless you explicitly
# know otherwise.
class a:    
    def __init__(self):
        self._variable = 6

    def b(self, value=UseDefault):
        if value is UseDefault:
            value = self._variable
        print value

AHORA None se puede pasar a b sin que se utilice el valor predeterminado.

Respondido el 09 de enero de 11 a las 11:01

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.