Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Python: does calling a method 'directly' instantiate the object?

Tags:

python

I am new to Python and while unit testing some methods on my object I noticed something 'weird'.

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

    def say(self, s):
        print s

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

if __name__ == '__main__':
    main()

I wrote this little example to illustrate where I got confused. If you do Ape().say('eeek') does this actually instantiate an Ape object and run the init method? I thought it wouldn't but I had some weird side effects so now I am thinking it does?

like image 708
Pickels Avatar asked Jul 08 '10 02:07

Pickels


2 Answers

If you want to call a method directly without creating an instance you can use the staticmethod decorator. Notice that there is no self when you use a static method

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

    @staticmethod
    def say(s):
        print s

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

if __name__ == '__main__':
    main()

Compare with class methods where the class is the first parameter instead of an instance

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()
like image 88
John La Rooy Avatar answered Oct 24 '22 08:10

John La Rooy


Yes it does. That's what Ape() does: it creates an new Ape object, and as part of that process the __init__ method gets run.

In your example, you then call the say method of that object. Note that there would be no way to call say if you didn't have an Ape object.

like image 22
David Z Avatar answered Oct 24 '22 09:10

David Z