¿Cómo puede el método estático acceder a la variable de clase en Python?

3 minutos de lectura

Así es como se ve mi código

class InviteManager():
    ALREADY_INVITED_MESSAGE = "You are already on our invite list"
    INVITE_MESSAGE = "Thank you! we will be in touch soon"

    @staticmethod
    @missing_input_not_allowed
    def invite(email):
        try:
            db.session.add(Invite(email))
            db.session.commit()
        except IntegrityError:
            return ALREADY_INVITED_MESSAGE
        return INVITE_MESSAGE

Cuando ejecuto mis pruebas, veo

NameError: global name 'INVITE_MESSAGE' is not defined

como puedo acceder INVITE_MESSAGE en el interior @staticmethod?

Puedes acceder a ella como InviteManager.INVITE_MESSAGEpero una solución más limpia es cambiar el método estático a un método de clase:

@classmethod
@missing_input_not_allowed
def invite(cls, email):
    return cls.INVITE_MESSAGE

(O, si su código es realmente tan simple como parece, puede reemplazar toda la clase con un montón de funciones y constantes en un módulo. Los módulos son espacios de nombres).

  • O simplemente conviértalo en una función a nivel de módulo.

    usuario395760

    25 de agosto de 2013 a las 16:52

  • @delnan: sí. Sin embargo, a veces necesita una clase o un método estático, en particular en situaciones que involucran herencia o tipificación pato.

    – Fred Foo

    25 de agosto de 2013 a las 16:52

  • Cualquier idea de por qué python permite acceder class variable a través de staticmethod? Si es así, ¿por qué necesitamos classmethod? ¿Cuál es el caso de uso diferente entre classmethod y staticmethod si ambos pueden acceder a las variables de clase?

    – Java Sa

    24 de abril de 2019 a las 9:11


Probar:

class InviteManager():
    ALREADY_INVITED_MESSAGE = "You are already on our invite list"
    INVITE_MESSAGE = "Thank you! we will be in touch soon"

    @staticmethod
    @missing_input_not_allowed
    def invite(email):
        try:
            db.session.add(Invite(email))
            db.session.commit()
        except IntegrityError:
            return InviteManager.ALREADY_INVITED_MESSAGE
        return InviteManager.INVITE_MESSAGE

los InviteManager está en el alcance de sus métodos estáticos.

avatar de usuario
soñador

Me acabo de dar cuenta, necesitaba @classmethod

class InviteManager():
    ALREADY_INVITED_MESSAGE = "You are already on our invite list"
    INVITE_MESSAGE = "Thank you! we will be in touch soon"

    @classmethod
    @missing_input_not_allowed
    def invite(cls, email):
        try:
            db.session.add(Invite(email))
            db.session.commit()
        except IntegrityError:
            return cls.ALREADY_INVITED_MESSAGE
        return cls.INVITE_MESSAGE

Usted puede leer sobre ello aquí

Puedes acceder a tus atributos con InviteManager.INVITE_MESSAGE y InviteManager.ALREADY_INVITED_MESSAGE sin cambiar nada en su declaración.

Simplemente, comprenda el concepto de variables/métodos de nivel de clase y variables/métodos de nivel de instancia.

Mientras trabaja con métodos estáticos, no usará uno mismo palabra clave como uno mismo La palabra clave se usa para representar la instancia de la clase o para usar variables de instancia de la clase. De hecho un uso nombre de la clasevea el siguiente ejemplo:

class myclass():
    msg = "Hello World!"

    @staticmethod
    def printMsg():
        print(myclass.msg)



myclass.printMsg() #Hello World!
print(myclass.msg) #Hello World!
myclass.msg = "Hello Neeraj!"
myclass.printMsg() #Hello Neeraj!
print(myclass.msg) #Hello Neeraj!

Es mucho más simple que todo eso:

Recien agregado __class__ a las variables de clase. Al igual que:

return __class__.ALREADY_INVITED_MESSAGE
        return __class__.INVITE_MESSAGE

No es necesario mencionar el ClassName (InviteManager) y no es necesario utilizar un classmethod

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad