Как переменная класса доступа к статическому методу в 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?

23
25 авг. '13 в 19:47
источник поделиться
4 ответов

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

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

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

25
25 авг. '13 в 19:51
источник

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
25 авг. '13 в 19:51
источник

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

1
25 авг. '13 в 19:51
источник

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

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

0
25 авг. '13 в 19:51
источник

Посмотрите другие вопросы по метке или Задайте вопрос