Discussione:
Riguardo ai metodi di classe ed ai metodi statici...
(troppo vecchio per rispondere)
Elric
2009-04-11 17:54:41 UTC
Permalink
Salve,
sto studiando python, e sono ora venuto a conoscenza dell'esistenza
dei metodi statici e dei metodi di classe...
Quello che non mi è chiaro è quale sia la differenza tra i due.

Leggendo Wikipedia, pare che :
"I metodi di classe - detti anche metodi statici - rappresentano
operazioni che non sono da riferirsi ai singoli oggetti ma alla classe
nel suo insieme."

Dunque, i metodi statici e i metodi di classe sono la stessa cosa?
E allora perchè ci sono due modi diversi di definirli?
E allora quando è bene usare i primi e quando i secondi ?


Chiedo venia, ma questa cosa mi sta confondendo...

Cheers,
Elric W.
Y3s
2009-04-11 18:05:55 UTC
Permalink
Post by Elric
Salve,
sto studiando python, e sono ora venuto a conoscenza dell'esistenza dei
metodi statici e dei metodi di classe... Quello che non mi è chiaro è
quale sia la differenza tra i due.
"I metodi di classe - detti anche metodi statici - rappresentano
operazioni che non sono da riferirsi ai singoli oggetti ma alla classe
nel suo insieme."
Questo vale per altri linguaggi, non python.
Post by Elric
Dunque, i metodi statici e i metodi di classe sono la stessa cosa? E
allora perchè ci sono due modi diversi di definirli? E allora quando è
bene usare i primi e quando i secondi ?
Chiedo venia, ma questa cosa mi sta confondendo...
http://docs.python.it/html/lib/built-in-funcs.html

Leggiti la documentazione di staticmethod() e di classmethod(), c'è
spiegata la differenza

Ciao
--
Antonio Valente
Francesco Bochicchio
2009-04-13 06:25:08 UTC
Permalink
Post by Y3s
Post by Elric
Salve,
sto studiando python, e sono ora venuto a conoscenza dell'esistenza dei
metodi statici e dei metodi di classe... Quello che non mi è chiaro è
quale sia la differenza tra i due.
"I metodi di classe - detti anche metodi statici - rappresentano
operazioni che non sono da riferirsi ai singoli oggetti ma alla classe
nel suo insieme."
Questo vale per altri linguaggi, non python.
Post by Elric
Dunque, i metodi statici e i metodi di classe sono la stessa cosa? E
allora perchè ci sono due modi diversi di definirli? E allora quando è
bene usare i primi e quando i secondi ?
Chiedo venia, ma questa cosa mi sta confondendo...
http://docs.python.it/html/lib/built-in-funcs.html
Leggiti la documentazione di staticmethod() e di classmethod(), c'è
spiegata la differenza
Ciao
Non credo di avere mai usato uno staticmethod in python...
Hanno senso in linguaggi 'ostinatamente' OO come Java, che
non hanno funzioni, oppure in linguaggi con 'protezioni di
accesso' come Java/C++/..., ma in python sono equivalenti a delle
funzioni, eccetto che sono definite nel namespace della classe.

Oppure no?


Ciao
----
FB
Alan Franzoni
2009-04-15 12:40:14 UTC
Permalink
Elric ha proferito le seguenti parole:

[cut]

Un metodo statico altro non è che una funzione "libera" che viene abbinata
ad una classe per il puro "gusto" della pertinenza alla stessa. Spesso
viene usato per sopperire alla mancanza di un certo metodo in un oggetto,
magari un builtin, che non si ha voglia di ereditare & estendere.

In python, dove le funzioni sono oggetti first classi, i metodi statici
sono utilizzati relativamente poco. Sono esattamente e semplicemente delle
funzioni.

class Pippo(object):
@staticmethod
def myfunc(a, b, c):
print a, b, c

invocando Pippo.myfunc(1,2,3) otterrai come risultato semplicemente
1 2 3

La stessa cosa accadrà sostituendo alla classe Pippo qualsiasi oggetto
della stessa classe.

Un classmethod è invece legato in maniera più stretta alla classe e ne
contiene un riferimento.

class Pippo(object):
@classmethod
def myfunc(a, b, c):
print a, b, c
Pippo.myfunc(1,2,3)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: myfunc() takes exactly 3 arguments (4 given)
Pippo.myfunc(1,2)
<class '__main__.Pippo'> 1 2

Infatti in genere si dichiara come

def myfunc(cls, arg1, arg2...):


Può essere usato indifferentemente dalla classe o da istanze della stessa,
il primo argomento passato alla funzione sarà sempre l'oggetto classe.
--
Alan Franzoni <***@gmail.com>
-
Togli .xyzz dalla mia email per contattarmi.
-
GPG Key Fingerprint:
5C77 9DC3 BD5B 3A28 E7BC 921A 0255 42AA FE06 8F3E
Loading...