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 :

héritage de classe


Sujet :

Python

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut héritage de classe
    salut,

    est ce que on peut faire appel a une méthode de classe, depuis une autre classe sans instancié la première?

    et cette ecriture veut dire quoi:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     def GetFundMarketMaker(self,account=None):                  
         return self._Controller__dat.GetFundMarketMaker(account)
    récusrsivité???
    merci

  2. #2
    Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    11
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 11
    Par défaut
    1-Non, Une classe c'est une description abstraite d'un objet.
    2-Non, c'est pas de la récursivité. Il faudrait poster le code, mais je suppose (vu que le titre parle d'heritage) que c'est de la délégation:

    Un petit exemple de délégation:
    Code : 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
    27
    28
    29
     
    class Caree:
        def __init__(self):
            self.type='Caree'
     
        def DrawMe(self):
            #juste par exemple,
            print self.type
     
    class Hexagone:
        def __init__(self):
            self.type='Hexagone'
     
        def DrawMe(self):
            #On suppose que le contenu des deux DrawMe soit different
            print self.type
     
     
    class MyShapes:
        def __init__(self):
            self.shapes=[Caree(),Hexagone()]
     
        def DrawMe(self):
            for shape in self.shapes:
                shape.DrawMe()
     
    if __name__=='__main__':
        instance=MyShapes()
        instance.DrawMe()
    Je te conseil de lire les bases de l'P-O-O.

  3. #3
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Je ne suis pas d'accord avec la réponse à la première question.
    Il ne faut pas confondre méthode d'instance, méthode de classe et méthode statique (les 3 existent en python).
    Une méthode de classe (ou une méthode statique) peut être appelée sans instancier la classe.
    exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    class A(object):
        @classmethod
        def f(cls):
            print "hello from", cls.__name__
     
    >>> A.f()
    hello from A
    En outre, en python, une classe n'est pas quelque chose de purement abstrait mais a un existence à l'exécution; c'est un objet comme un autre qui est par défaut du type 'type'.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    salut,
    tu es sur de ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Une méthode de classe (ou une méthode statique) peut être appelée sans instancier la classe.

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par moon93
    salut,
    tu es sur de ça:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Une méthode de classe (ou une méthode statique) peut être appelée sans instancier la classe.
    C'est quand même un peu le principe des méthodes statiques

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    ça marche pas j'ai essayé d'appelé une fonction de classe depuis une autre classe,
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    OrdersTab_LC.OrdersTabBind.Reset()
    mais j'ai eu le messsage d'erruer suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    TypeError: ('unbound method Reset() must be called with OrdersTabBind instance a
    s first argument (got nothing instead)',)

  7. #7
    Invité
    Invité(e)
    Par défaut
    Euh donne plus d'indications car cela fonctionne parfaitement.
    Un petit exemple que je viens de faire pour vérifier par acquis de conscience :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class A:
     
        @classmethod
        def Fonction(cls):
            print "Chou !!!"
     
     
    if __name__ == "__main__":
     
        A.Fonction()
    ++, PierreAd

  8. #8
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Oui ça marche c'est certain.
    Ce que moon93 essaie d'appeler c'est sûrement une méthode d'instance.

  9. #9
    Invité
    Invité(e)
    Par défaut
    Je ne sais pas, je comprenais plutôt qu'il essayait d'appeler une méthode statique de sa classe (une fonction de classe, ça me fait penser à ça...)

    Moon dis nous ce que tu essaies de faire

  10. #10
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    D'après le message d'erreur qu'il a posté, c'est clairement une méthode d'instance qu'il a essayé d'appeler.

    Moon93, si ta méthode n'utilise pas d'attribut d'instances (çàd si tu n'utilise pas l'argument self dedans), déclare-la comme une méthode statique en ajoutant @staticmethod devant le def et en enlevant l'argument self.
    Si tu utilises le self, ce n'est clairement pas possible, c'est qu'il y a une erreur dans ta logique quelque part.

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    tu veux dire que si ya un self dans la definition de la methode ça veut dire que c'est pas une méthode statique???

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    233
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 233
    Par défaut
    ce que je veux faire c'est de pouvoir appeler une méthode de classe sans instancier la classe....;la solution c'est de la déclaré statique, c ça?

  13. #13
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par moon93
    tu veux dire que si ya un self dans la definition de la methode ça veut dire que c'est pas une méthode statique???
    Hum oui. Si tu utilises le mot clef self dans la définition de la méthode, il s'agira d'une méthode "d'instance" (je ne sais pas si ce terme est le bon) et non pas d'une méthode statique. Pour cela, il faut utiliser decorator @classmethod, comme montré plus haut dans la page, et tu utilises le mot-clef "cls" au lieu de self.


    Edit : En fait, il semble possible de créer une méthode statique qui prenne en paramètre la référence self sur l'objet, là faudra m'expliquer ?
    Dernière modification par Invité ; 26/07/2007 à 13h04.

  14. #14
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    J'appelle ça méthode d'instance parce que:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    >>> class A:
    ... 	def f():
    ... 		pass
    ... 	
    >>> type(A.f)
    <type 'instancemethod'>
    Un exemple avec les 3 types de méthodes et les accès possibles:
    Code : 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
    class A(object):
     
        x = 0
     
        def __init__(self):
            self.y = 1
     
        def f(self):
            self.g()
            self.h()
            return self.y
     
        @classmethod
        def g(cls):
            # pas d'accès à y ni à f
            cls.h()
            return cls.x
     
        @staticmethod
        def h():
            # pas d'accès à x,y,f ou g
            return 2

  15. #15
    Membre Expert
    Homme Profil pro
    Inscrit en
    Mars 2007
    Messages
    941
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2007
    Messages : 941
    Par défaut
    Citation Envoyé par PierreAd
    Edit : En fait, il semble possible de créer une méthode statique qui prenne en paramètre la référence self sur l'objet, là faudra m'expliquer ?
    Ben "self" n'est pas un mot-clé; c'est un identifiant comme un autre. C'est seulement par convention qu'on l'appelle toujours "self". Si un programmeur Java se mettait à Python et commencait à écrire "this" partout au lieu de "self", ça fonctionnerait aussi bien...

    Donc à partir de ce moment, rien n'empêche d'écrire une méthode statique avec un argument qui s'appelle 'self'. Mais ça n'aura pas le même sens:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    class A:
        @staticmethod
        def f(self):
            print self
     
    >>> A.f()
    Traceback (most recent call last):
      File "<interactive input>", line 1, in <module>
    TypeError: f() takes exactly 1 argument (0 given)
    >>> A().f()
    Traceback (most recent call last):
      File "<interactive input>", line 1, in <module>
    TypeError: f() takes exactly 1 argument (0 given)
    >>> A.f('toto')
    toto

Discussions similaires

  1. conflit d'inclusions et Héritage de classe
    Par gedeon555 dans le forum C++
    Réponses: 7
    Dernier message: 01/10/2006, 19h48
  2. [POO] Problème héritage des classes PHP4
    Par zana74 dans le forum Langage
    Réponses: 2
    Dernier message: 15/08/2006, 16h00
  3. Héritage de classes.
    Par Berzerk_ dans le forum C++
    Réponses: 48
    Dernier message: 13/08/2006, 23h48
  4. [POO] Héritage vs classe dans une classe
    Par robichou dans le forum Langage
    Réponses: 4
    Dernier message: 06/08/2006, 23h51
  5. [OO] Héritage - Mixins Classes
    Par djmalo dans le forum Langages de programmation
    Réponses: 4
    Dernier message: 01/03/2005, 23h16

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