Python:调用方法'直接'实例化对象?

时间:2010-07-08 02:27:29

标签: python

我是Python的新手,当我在对象上测试一些方法时,我发现了一些“怪异”的东西。

class Ape(object):
    def __init__(self):
        print 'ooook'

    def say(self, s):
        print s

def main():
    Ape().say('eeek')

if __name__ == '__main__':
    main()

我写了这个小例子来说明我感到困惑的地方。如果你做Ape()。说('eeek')这实际上是实例化一个Ape对象并运行init方法吗?我认为不会,但我有一些奇怪的副作用,所以现在我在想它呢?

3 个答案:

答案 0 :(得分:13)

如果要在不创建实例的情况下直接调用方法,可以使用staticmethod装饰器。请注意,使用静态方法时没有self

class Ape(object):
    def __init__(self):
        print 'ooook'

    @staticmethod
    def say(s):
        print s

def main():
    Ape.say('eeek')

if __name__ == '__main__':
    main()

与类方法比较,其中类是第一个参数而不是实例

class Ape(object):
    def __init__(self):
        print 'ooook'

    @classmethod
    def say(cls, s):
        print "the class is:", cls
        print s

def main():
    Ape.say('eeek')

if __name__ == '__main__':
    main()

答案 1 :(得分:11)

是的。这就是Ape()的作用:它创建了一个新的Ape对象,并且作为该过程的一部分,__init__方法被运行。

在您的示例中,然后调用该对象的say方法。请注意,如果您没有say对象,则无法调用Ape

答案 2 :(得分:3)

是。 Ape()实例化类Ape的对象,但由于没有赋值,因此没有与之关联的标签。此时调用其__init__函数。然后,调用say函数。

要明确:

Ape().say('eeek')

相当于:

(Ape()).say('eeek')

更清楚地表明首先发生的事情。