Un metodo statico è un metodo intrinseco della classe e non dell'istanza creata dalla classe.
Provo a spiegarmi meglio:
quando creo una classe MyClass, definisco il costruttore __init__ chiamato ogniqualvolta creo un oggetto (o istanza) di tale classe e tutte le relative funzioni (o metodi):
class MyClass:
def __init__(self, x, y):
self.x = x
self.y = y
def print_coord(self):
print(self.x, self.y)
Il metodo print_coord non riceve nessun argomento se non il "self". Quindi vuol dire che per poterla usare dovrò prima inizializzare un'istanza e poi richiamare la funzione:
>>> MyClass(10, 20).print_coord()
10 20
Se provassi a richiamare tale funzione senza prima inizializzare un oggetto, non avrei più il self e quindi riceverei questo errore:
TypeError: unbound method print_coord() must be called with MyClass instance as first argument (got nothing instead)
Esistono però dei metodi che non per forza devono ricevere il self come primo argomento e che quindi possono essere richiamati senza dover prima inizializzare un'istanza di tale classe. Riprendendo l'esempio di prima potrei definire il seguente metodo statico (tramite decoratori @xxxxxxx -
https://goo.gl/uMC5dC):
class MyClass:
def __init__(self, x, y):
self.x = x
self.y = y
def print_coord(self):
print(self.x, self.y)
@staticmethod
def print_hello(name):
print("Hello %s!!!" % name)
Questo metodo può essere richiamato così (non viene richiamato il metodo __init__):
>>> MyClass.print_hello("Powner")
Hello Powner!!!
Magari loro te lo sapranno spiegare meglio:
https://stackoverflow.com/questions/12179271/meaning-of-classmethod-and-staticmethod-for-beginner
Visto che questi metodi statici non sono collegati al self (quindi ad un'istanza della classe), possono essere definiti come semplici funzioni "globali", esterne alla classe:
def print_hello(name):
print("Hello %s!!!" % name)
class MyClass:
def __init__(self, x, y):
self.x = x
self.y = y
def print_coord(self):
print(self.x, self.y)
>>> MyClass(10, 20).print_coord()
10 20
>>> print_hello("Powner")
Hello Powner!!!