Подтвердить что ты не робот

Как переменная класса доступа к статическому методу в Python?

Вот как выглядит мой код

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

Когда я запускаю свои тесты, я вижу

NameError: global name 'INVITE_MESSAGE' is not defined

Как я могу получить доступ к INVITE_MESSAGE внутри @staticmethod?

4b9b3361

Ответ 1

Вы можете получить к нему доступ как InviteManager.INVITE_MESSAGE, но более чистым решением является изменение статического метода на метод класса:

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

(Или, если ваш код действительно прост, как выглядит, вы можете заменить весь класс связкой функций и констант в модуле. Модули - это пространства имен.)

Ответ 2

Try:

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

InviteManager входит в объем его staticmethods.

Ответ 3

Вы можете получить доступ к своим атрибутам с помощью InviteManager.INVITE_MESSAGE и InviteManager.ALREADY_INVITED_MESSAGE, не изменяя ничего в своем объявлении.

Ответ 4

Только что понял, мне нужно @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

Вы можете прочитать об этом здесь