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

8 投票
3 回答
5617 浏览
提问于 2025-04-16 00:58

我刚开始学习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().say('eeek'),这是不是实际上创建了一个Ape对象并运行了初始化方法?我原以为不会这样,但出现了一些奇怪的副作用,所以现在我在想,可能确实是这样?

3 个回答

3

没错。Ape() 是在创建一个Ape类的对象,不过因为没有给它起名字,所以它没有标签。这个时候,它的 __init__ 函数会被调用。接着,say函数也会被调用。

为了更清楚:

Ape().say('eeek')

这相当于:

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

这样更清楚地说明了先发生了什么。

14

如果你想直接调用一个方法,而不需要先创建一个对象,你可以使用 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()
12

是的,确实如此。这就是Ape()的作用:它创建了一个新的Ape对象,并且在这个过程中会运行__init__方法。

在你的例子中,你接着调用了那个对象的say方法。注意,如果没有Ape对象,就无法调用say方法。

撰写回答