IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Méthodes statiques de classes et lambda [Python 2.X]


Sujet :

Python

  1. #1
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut Méthodes statiques de classes et lambda
    Bonjour à tous

    J'ai deux questions qui se rejoignent donc je vais les poser ensemble

    Q1: Quelle est la bonne façon d'appeler une méthode statique de classe. Faut-il appeler self.xxx() ou classe.xxx() ?
    Exemple
    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    class toto(object):
            @staticmethod
    	def xxx(n): return n**2
     
    	def __init__(self):
    		pass
     
    	def action1(self, n):
    		return toto.xxx(n) + self.xxx(n)
    #class toto
     
    a=toto()
    print a.action1(5)

    Dans la méthode "action1", l'appel à toto.xxx() ou self.xxx() produisent le même appel à la méthode statique xxx(). Donc y a-t-il une différence invisible ou plus simplement une façon plus préférentielle d'appeler "xxx()" ???

    Q2: Pourquoi la même façon de faire ne fonctionne plus avec une lambda ?

    Code python : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    #!/usr/bin/env python
    # -*- coding: utf-8 -*-
     
    class toto(object):
            @staticmethod
    	def xxx(n): return n**2
     
    	yyy=lambda x, y: "[%s] [%s]" % (x, y)
     
    	def __init__(self):
    		pass
     
    	def action1(self, n):
    		return toto.xxx(n) + self.xxx(n)
     
    	def action2(self, n):
    		return self.yyy(self, n)
     
    	def action3(self, n):
    		return toto.yyy(self, n)
    # class toto
     
    a=toto()
    print a.action1(5)
    print a.action2(5)
    print a.action3(5)

    Donc là je rajoute une lambda "yyy" qui (dans mon esprit) est aussi une méthode statique (donc pas différente de "xxx").
    Déjà première chose: quand j'appelle la lambda dans "action2()" je lui passe implicitement 2 paramètres: l'instance de toto et la valeur 5. Je suis donc obligé de prévoir que ma lambda recevra un paramètre à priori inutile dans son travail. Et ce n'est plus non plus un comportement analogue à "xxx()"
    Mais si ensuite je tente de l'appeler via son nom de classe (comme j'ai fait pour "xxx"), ben ça plante en me répondant que la lambda doit recevoir une instance de toto.

    Bref en fait j'ai l'impression qu'une méthode statique n'est pas vraiment statique en fait... ou alors c'est la lambda...

    Merci de votre retour...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Salut,

    Citation Envoyé par Sve@r Voir le message
    Q1: Quelle est la bonne façon d'appeler une méthode statique de classe. Faut-il appeler self.xxx() ou classe.xxx() ?
    La documentation mentionne les deux, donc çà va dépendre du "contexte".

    Q2: Pourquoi la même façon de faire ne fonctionne plus avec une lambda ?

    Bref en fait j'ai l'impression qu'une méthode statique n'est pas vraiment statique en fait... ou alors c'est la lambda...
    Dans votre exemple yyy n'est pas déclaré comme "staticmethod" donc elle va recevoir un premier argument (classe ou instance). De plus, vous utilisez encore Python2 alors que Python3 a heureusement simplifié tout çà.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par wiztricks Voir le message
    La documentation mentionne les deux, donc çà va dépendre du "contexte".
    Merci

    Citation Envoyé par wiztricks Voir le message
    Dans votre exemple yyy n'est pas déclaré comme "staticmethod" donc elle va recevoir un premier argument (classe ou instance).
    J'avais essayé de rajouter @staticmethod mais ça donne une erreur de syntaxe. Ce qui semble normal. Déjà ce n'est pas une méthode (pas de def devant le nom) et par ailleurs quand je crée un membre statique style parametreDeToto=150 je n'ai pas à mettre @staticmethod devant pour qu'il soit statique...

    Citation Envoyé par wiztricks Voir le message
    De plus, vous utilisez encore Python2 alors que Python3 a heureusement simplifié tout çà.
    Ben peut-être que Python3 c'est effectivement 100 fois mieux mais moi je suis sous Python2 (par choix/contrainte/miracle de la vie/désespoir/fabulation/tout_ce_que_vous_voudrez...) et je l'ai bien indiqué dans mon préfixe donc voilà ; ma question concerne bien P2 (qui sera maintenu jusqu'en 2020).

    Mais bon, ce n'est pas un souci majeur. C'est arrivé parce que je me suis aperçu que j'avais une méthode statique qui ne faisait qu'un truc (probablement un héritage de l'époque où je n'étais pas très à l'aise avec les lambda) ; j'ai voulu la mettre en lambda et ça a planté donc je m'interroge (non en réalité j'interroge le forum ) mais sinon je garde ma méthode statique et ça fonctionne aussi très bien comme ça...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  4. #4
    Membre actif
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2013
    Messages
    156
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Octobre 2013
    Messages : 156
    Points : 218
    Points
    218
    Par défaut
    Bonjour,

    Je ne sais pas si ça marche en Python2, mais pour rendre statique une lambda il faut utiliser le décorateur staticmethod comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    yyy=staticmethod(lambda x, y: "[%s] [%s]" % (x, y))
    Vu qu'une lambda n'as pas tout a fait la forme d'une methode, il faut utiliser la seconde forme (forme de fonction) des décorateurs

  5. #5
    Expert éminent sénior
    Homme Profil pro
    Architecte technique retraité
    Inscrit en
    Juin 2008
    Messages
    21 283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Manche (Basse Normandie)

    Informations professionnelles :
    Activité : Architecte technique retraité
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2008
    Messages : 21 283
    Points : 36 770
    Points
    36 770
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    J'avais essayé de rajouter @staticmethod mais ça donne une erreur de syntaxe. Ce qui semble normal. Déjà ce n'est pas une méthode (pas de def devant le nom) et par ailleurs quand je crée un membre statique style parametreDeToto=150 je n'ai pas à mettre @staticmethod devant pour qu'il soit statique...
    Il faut revenir aux basiques des décorateurs:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class toto(object):
     
    	yyy = lambda x, y: "[%s] [%s]" % (x, y)
            yyy = staticmethod(yyy)
    en se rappelant que @decorator n'est que sucre syntaxique.

    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 689
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 689
    Points : 30 983
    Points
    30 983
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par IPreferCSharp Voir le message
    Je ne sais pas si ça marche en Python2, mais pour rendre statique une lambda il faut utiliser le décorateur staticmethod comme ca :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    yyy=staticmethod(lambda x, y: "[%s] [%s]" % (x, y))
    Super, ça fonctionne

    PS: j'aime toujours autant ton pseudo

    Citation Envoyé par wiztricks Voir le message
    Il faut revenir aux basiques des décorateurs...en se rappelant que @decorator n'est que sucre syntaxique.
    Ouais, c'est effectivement un de mes problèmes: j'utilise parfois des raccourcis découverts sur le net (quand je cherche des trucs) sans vraiment les comprendre... (pas par fainéantise !!! mais parce que je ne trouve pas l'explication)...

    Merci de votre aide
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. classe normale/méthodes statiques ou classe abstraite/méthodes normales
    Par Renaud MENGELLE dans le forum Architecture
    Réponses: 4
    Dernier message: 19/07/2012, 15h01
  2. Réponses: 1
    Dernier message: 31/05/2010, 14h38
  3. [POO] Classes et méthodes statiques
    Par Info-Rital dans le forum Langage
    Réponses: 1
    Dernier message: 20/12/2007, 13h00
  4. Réponses: 19
    Dernier message: 05/06/2007, 08h13
  5. Pattern singleton ou Classe avec méthodes statiques ?
    Par Claythest dans le forum Langage
    Réponses: 3
    Dernier message: 11/12/2006, 11h28

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo