Python @staticmethod and @classmethod

@Static Method

@staticmethod it is a “normal” function inside a class. When this method is called, we don’t pass an instance of the class to it (as we normally do with methods). This means you can put a function inside a class but you can’t access the instance of that class (this is useful when your method does not use the instance).

A typical scenario involves a function that logically belongs to a class and we don’t want to have it floating around in the file, but at the same time it doesn’t really need any instance of the class to work.

A (probably not very good) example:

class Pizza(object):
    def __init__(self, size):
        self.size = size

    def get_size(self):
        return self.size

    def whatever(self):
        return self.doSomething(10, 20)

    @staticmethod
    def doSomething(x, y):
        return x + y

print(Pizza.get_size)
# <unbound method Pizza.get_size> (py2)
# <function Pizza.get_size at 0x10efa1488> (py3)

print(Pizza(10).get_size)
# <bound method Pizza.get_size of <__main__.Pizza object #
# at 0x1015ce150>>

print(Pizza(10).get_size())
# 10

print(Pizza(10).whatever())
# 30

@Classmethod

@classmethod is a decorator for a method that must have a reference to a class object as its first parameter. Honestly, it looks like nobody has a damn clue what they’re really good for in real life, besides overloading constructors; since Python doesn’t have overloading, if we want multiple constructors that’s a way to do it.

class myClass(object):

    # default constructor
    # init from whatever built-in type
    def __init__(self, data=None):
        self.data = data

    # alternative constructor
    # init from a file
    @classmethod
    def init_file(cls, file_name):
        data = open(file_name).readline()
        return cls(data)
        

print myClass([1,2,3]).data
print myClass.init_file('/etc/hosts').data