2013-08-25 6 views
26

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

ответ

27

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

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

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

+0

Или просто введите функцию уровня модуля. – delnan

+1

@ delnan: да. Иногда вам нужен класс или статический метод, хотя, в частности, в ситуациях, связанных с наследованием или утиным типом. –

4

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.

0

Просто понял, что мне нужно @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 

Вы можете прочитать об этом here

1

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

Смежные вопросы