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

Pic*_*els 9 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()
Run Code Online (Sandbox Code Playgroud)

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

Joh*_*ooy 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()
Run Code Online (Sandbox Code Playgroud)

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

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()
Run Code Online (Sandbox Code Playgroud)


Dav*_*d Z 11

是的,它确实.这就是Ape():它创建一个新Ape对象,并作为该过程的一部分__init__运行该方法.

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