OVH Cloud OVH Cloud

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 ?

4 réponses

1 2
Avatar
Christophe
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).


Mais c'est juste que c'est comme ça que ça marche en Python et il faut
faire avec. C'est fait volotairement, comme pour le paramètre self
explicite.


Avatar
Bruno Desthuilliers

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.


Et alors ? C'est une staticmethod, non ? En Python, le récepteur d'un
message n'est pas implicite.

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.


module.

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).


Dans un autre fichier que quoi ?


Avatar
JBB
Bruno Desthuilliers wrote:

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.


Et alors ? C'est une staticmethod, non ? En Python, le récepteur d'un
message n'est pas implicite.

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.


module.

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).


Dans un autre fichier que quoi ?
Je ne sais pas ce qu'est un module 'python'

pour moi c'est un juste un ensemble de fonction definies dans un fichier
.py que l'on importe dans son propre fichier .py



Avatar
Bruno Desthuilliers
Bruno Desthuilliers wrote:


(snip)



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



module.

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).



Dans un autre fichier que quoi ?


Je ne sais pas ce qu'est un module 'python'


http://www.python.org/doc/2.4.2/tut/node8.html
"""
A module is a file containing Python definitions and statements. The
file name is the module name with the suffix .py appended.
"""

pour moi c'est un juste un ensemble de fonction
definies dans un fichier
.py que l'on importe dans son propre fichier .py


C'est une vision très limitée:

Python 2.4.1 (#1, Jul 23 2005, 00:37:37)
[GCC 3.3.4 20040623 (Gentoo Linux 3.3.4-r1, ssp-3.3.2-2, pie-8.7.6)] on
linux2
Type "help", "copyright", "credits" or "license" for more information.
dir()
['__builtins__', '__doc__', '__name__']



import random
dir()
['__builtins__', '__doc__', '__name__', 'random']



random
<module 'random' from '/usr/lib/python2.4/random.pyc'>



random.__class__
<type 'module'>



random.__class__.__dict__.keys()
['__setattr__', '__new__', '__getattribute__', '__delattr__',



'__repr__', '__dict__', '__doc__', '__init__']
random.__dict__.keys()
['WichmannHill', '_sin', '_exp', 'randrange', 'BPF', '_acos', '_random',



'_test', 'random', 'paretovariate', 'normalvariate', 'gammavariate',
'sample', 'seed', 'weibullvariate', '__name__', 'shuffle', 'uniform',
'expovariate', '_floor', 'LOG4', '__all__', 'randint',
'vonmisesvariate', '_pi', 'TWOPI', '_cos', 'Random', 'betavariate',
'_e', '__doc__', 'getrandbits', 'setstate', 'lognormvariate',
'SystemRandom', '__builtins__', '__file__', '_urandom', 'gauss',
'choice', 'getstate', 'jumpahead', '_log', '_BuiltinMethodType',
'_hexlify', 'RECIP_BPF', '_inst', '_test_generator', 'SG_MAGICCONST',
'_warn', '_MethodType', '_sqrt', 'NV_MAGICCONST']
import types
m = types.ModuleType('mon_module', 'un module sans fichier ???')
m
<module 'mon_module' (built-in)>



setattr(m, 'ma_fonction', lambda: "ma fonction dans mon module")
m.ma_fonction
<function <lambda> at 0x403feaac>



m.mafonction()
'ma fonction dans mon module'








Et oui, en Python, un module est (aussi...) un objet. Bref...

Pour en revenir à ta question d'origine: si tu veux regrouper un
ensemble de définitions, le langage te propose essentiellement deux
choix: les classes et les modules. Si cet ensemble de définition ne
répond pas à la sémantique d'une classe mais présente une certaine
cohérence interne et un faible couplage externe, le choix le plus
évident est le module - qui implique effectivement (le hack ci dessus
n'ayant guère d'intérêt en pratique) de regrouper ces définitions dans
un fichier séparé. Ce qui n'est pas forcément une mauvaise chose
(découplage, réutilisation...).

Par ailleurs, *a priori*, je ne vois guère l'intérêt de créer un
sous-espace de nommage dans un même module. Tu peux préciser ton cas
d'utilisation ?



1 2