Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

methode static

14 réponses
Avatar
JBB
est il possible de faire quelque chose du genre:

class A:
def methode_static() :
return 0

A.methode_static()
-> 0

ou a = A()
a.methode_static()
-> 0

en fait est ce que toutes les 'fonctions' definies dans une classe
doivent obligatoirement prendre 'self' comme argument ?

10 réponses

1 2
Avatar
R12y
On Tue, 25 Oct 2005 13:21:33 +0200, JBB wrote:
class A:
def methode_static() :
return 0

A.methode_static()
-> 0


Du Java, quoi... :-)

ou a = A()
a.methode_static()
-> 0


Dans ce dernier exemple, le fait qu'elle soit statique n'est pas mis en
avant, car tu l'appliques à une instance... ou bien, je me trompe?

en fait est ce que toutes les 'fonctions' definies dans une classe
doivent obligatoirement prendre 'self' comme argument ?


J'ai lu quelquepart que oui, mais je ne me rappelle plus ou...

--
Rakotomandimby Mihamina,
http://aspo.rktmb.org/activites/infogerance
Serveurs* sous Debian, Fedora...
(*) Serveurs!?: http://fr.search.yahoo.com/search?p=serveurs+dedies

Avatar
Hervé Cauwelier
en fait est ce que toutes les 'fonctions' definies dans une classe
doivent obligatoirement prendre 'self' comme argument ?


Non mais toutes ces réponses sont dans le tutorial de Python et le reste
de la documentation. On ne va pas la réécrire ici.

http://python.org/doc/2.4.2/tut/tut.html
http://python.org/doc/2.4.2/modindex.html

Elle existe peut-être en français, si d'autres ont un pointeur.

--
Hervé Cauwelier
http://www.oursours.net/

Avatar
Yermat
R12y wrote:
[...]
en fait est ce que toutes les 'fonctions' definies dans une classe
doivent obligatoirement prendre 'self' comme argument ?



non.

J'ai lu quelquepart que oui, mais je ne me rappelle plus ou...


Dans la doc...
Voir classmethod et staticmethod
http://www.python.org/doc/2.2.3/lib/built-in-funcs.html

--
Yermat


Avatar
Frédéric Momméja
Hervé Cauwelier écrivait le 25/10/05 14:07 :
Non mais toutes ces réponses sont dans le tutorial de Python et le reste
de la documentation. On ne va pas la réécrire ici.

http://python.org/doc/2.4.2/tut/tut.html
http://python.org/doc/2.4.2/modindex.html

Elle existe peut-être en français, si d'autres ont un pointeur.


Commencer par voir
<http://www.python-fr.org/>

et le Wiki Python Fr
<http://wikipython.flibuste.net/moin.py/FrontPage>... ;)

--
Frédéric Momméja

Avatar
yves
On Tue, 25 Oct 2005 13:21:33 +0200, JBB wrote:

est il possible de faire quelque chose du genre:

class A:
def methode_static() :
return 0

A.methode_static()
-> 0

ou a = A()
a.methode_static()
-> 0

Code retravaillé d'après la doc pointée par Yermat:

##############
class A:
def methode_static():
return 0
methode_static = staticmethod(methode_static)

print A.methode_static()
print A().methode_static()
##############
--
Yves

Avatar
tiissa
On Tue, 25 Oct 2005 13:21:33 +0200, JBB wrote:

est il possible de faire quelque chose du genre:

class A:
def methode_static() :
return 0

A.methode_static()
-> 0

ou a = A()
a.methode_static()
-> 0

Code retravaillé d'après la doc pointée par Yermat:

##############
class A:
def methode_static():
return 0
methode_static = staticmethod(methode_static)

print A.methode_static()
print A().methode_static()
##############


Pour information, a la version 2.4, les decorateurs de fonctions ont
ete introduits dans le langage. On peut donc ecrire la meme chose avec
une ligne en moins :

class A:
@staticmethod
def methode_statique():
return 0


Avatar
tiissa

On peut donc ecrire la meme chose avec
une ligne en moins :


... avec *zero* ligne en moins. Le progres n'en est pas moins
considerable. ;)

Avatar
JBB
class A:
@staticmethod
def methode_statique():
return 0

avec les 'decorator' c'est très joli.


Survient un autre problème:

class A:
@staticmethod
def f():
return 0
@staticmethod
def g():
return f()

Et là ça ne marche pas. je suis obligé de mettre A.f() alors que je suis
dans la classe A. Ce qui alourdit le code ( surtout qu'en vrai ma classe
ne s'appelle pas A)

En fait l'idée initiale était de regrouper dans un 'ensemble' plusieurs
fonctions.

En Java je les aurais mises static dans une classe, et C++ pareil ou
dans un namespace.
En python il y a peut-être une autre solution? les modules peut-être?
( mais je n'ai pas envie de le mettre dans un autre fichier).

Avatar
Christophe

class A:
@staticmethod
def methode_statique():
return 0

avec les 'decorator' c'est très joli.


Survient un autre problème:

class A:
@staticmethod
def f():
return 0
@staticmethod
def g():
return f()

Et là ça ne marche pas. je suis obligé de mettre A.f() alors que je suis
dans la classe A. Ce qui alourdit le code ( surtout qu'en vrai ma classe
ne s'appelle pas A)

En fait l'idée initiale était de regrouper dans un 'ensemble' plusieurs
fonctions.

En Java je les aurais mises static dans une classe, et C++ pareil ou
dans un namespace.
En python il y a peut-être une autre solution? les modules peut-être?
( mais je n'ai pas envie de le mettre dans un autre fichier).


Une staticmethod n'est pas dans une classe et tant que telle. Je te
conseille ici d'utiliser une classmethod à la place :

class A:
@classmethod
def f(cls):
return 0
@classmethod
def g(cls):
return cls.f()

De toute façon, les staticmethod ça ne sert pas beaucoup quand tu as des
vrais classmethod


Avatar
JBB
Christophe wrote:
Une staticmethod n'est pas dans une classe et tant que telle. Je te
conseille ici d'utiliser une classmethod à la place :

class A:
@classmethod
def f(cls):
return 0
@classmethod
def g(cls):
return cls.f()

De toute façon, les staticmethod ça ne sert pas beaucoup quand tu as des
vrais classmethod


Mais du coup, tu est oblige d'utiliser un paramètre d'appel 'cls' alors
que dans le cas présent il n'apporte rien.
du coup ca revient quasiment a la même chose qu'avec une classe normale:
class A:
def f(self):
return 0
def g(self):
return self.f()

Sauf que tu l'utile avec:
A.f()
au lieu de A().f()
(cela permet quand même d'éviter l'instanciation d'un objet).

1 2