64

这就是我的代码的样子

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

4

6 回答 6

60

您可以将其作为 访问InviteManager.INVITE_MESSAGE,但更简洁的解决方案是将静态方法更改为类方法:

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

(或者,如果你的代码真的像看起来那么简单,你可以用模块中的一堆函数和常量替换整个类。模块是命名空间。)

于 2013-08-25T16:51:27.693 回答
11

尝试:

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是在它的静态方法的范围内。

于 2013-08-25T16:51:03.083 回答
3

刚刚意识到,我需要@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

你可以在这里阅读

于 2013-08-25T16:51:15.867 回答
2

您可以访问您的属性,InviteManager.INVITE_MESSAGE无论InviteManager.ALREADY_INVITED_MESSAGE是否更改其声明中的任何内容。

于 2013-08-25T16:51:35.773 回答
2

它比所有这些都简单得多:

刚刚添加__class__到类变量中。像这样:

return __class__.ALREADY_INVITED_MESSAGE
        return __class__.INVITE_MESSAGE

无需提及 ClassName (InviteManager),也无需使用classmethod

于 2021-10-14T01:50:27.683 回答
2

简单地说,理解类级别变量/方法和实例级别变量/方法的概念。

在使用静态方法时,您不会使用self关键字,因为self关键字用于表示类的实例或使用类的实例变量。事实上,一个使用class_name,见下面的例子:

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!
于 2019-04-07T06:20:53.547 回答