关于python:不首先创建类的实例而调用函数

Call function without creating an instance of class first

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Static methods in Python?

我认为我的问题是非常直截了当的,但更清楚地说,我只是想知道,我有:

1
2
3
4
5
6
7
8
9
10
class MyBrowser(QWebPage):
    ''' Settings for the browser.'''

    def __init__(self):
        QWebPage.__init__(self)
        pass

    def userAgentForUrl(self, url=None):
        ''' Returns a User Agent that will be seen by the website. '''
        return"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15"

在另一个类中,也就是在同一个文件中,我想得到这个用户代理。

1
2
3
mb = MyBrowser()
user_agent = mb.userAgentForUrl()
print user_agent

我试着这样做:

1
print MyBrowser.userAgentForUrl()

但出现了这个错误:

1
TypeError: unbound method userAgentForUrl() must be called with MyBrowser instance as first argument (got nothing instead)

所以我希望你能理解我的要求,有时候我不想创建实例,而不想从这种函数中检索数据。所以问题是是否有可能做到,如果有,请给我一些如何做到这一点的指导。


这称为静态方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
class MyBrowser(QWebPage):
    ''' Settings for the browser.'''

    def __init__(self):
        QWebPage.__init__(self)
        pass

    @staticmethod
    def userAgentForUrl(url=None):
        ''' Returns a User Agent that will be seen by the website. '''
        return"Mozilla/5.0 (Windows NT 6.2; WOW64) AppleWebKit/537.15 (KHTML, like Gecko) Chrome/24.0.1295.0 Safari/537.15"


print MyBrowser.userAgentForUrl()

当然,您不能在其中使用self


添加staticmethod修饰符,删除self参数:

1
2
    @staticmethod
    def userAgentForUrl(url=None):

装饰器也将为您处理实例调用的情况,因此实际上您可以通过对象实例调用此方法,尽管通常不鼓励这种做法。(静态调用静态方法,而不是通过实例)。