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 :

Notation de type "_Classe__méthode()"


Sujet :

Python

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut Notation de type "_Classe__méthode()"
    Salut à tous,

    En lisant la FAQ (si si, il y a des gens qui la lisent ), je suis tombé sur une notation que j'ai déjà croisée, mais sans vraiment comprendre ni d'où elle sort ni à quoi elle sert précisément :
    (source : http://python.developpez.com/faq/?pa...ead#ThreadKill)


    À quoi correspond précisément cette notation ? Si j'ai bien compris, elle appelle la méthode de la classe mère Thread, c'est ça ?

    Quand est-ce que cette notation est valable ?
    Quel est son intérêt ?

    Quelle différence avec si on rajoute une méthode stop2 à la classe Affiche qui appelle "super(...).stop()" ?


    Merci d'avance


    -

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    222
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 222
    Par défaut
    Personnellement je ne crois pas que ça soit ça, je pense que ça appelle tout simplement la méthode _Thread__stop de ton objet a.

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Août 2004
    Messages
    723
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2004
    Messages : 723
    Par défaut
    Ce type de nommage, c'est du "mangling", c'est au départ une sorte d'émulation des attributs privés. En général ce sont des méthodes auxquelles on n'est pas censé accéder.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    class A:
        def __methodeprivee(self):
            pass
     
    print dir(A) # ['_A__methodeprivee', '__doc__', '__module__']

  4. #4
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    @nyko77 : ok mais "_Thread__stop" n'a été déclarée nulle part dans le code... Je cherchais donc à savoir à partir de quoi elle avait été créée.


    @oiffrig : ah, donc en fait c'est une sorte de renommage de méthodes privées Mais alors à quoi ça sert de faire des méthodes privées si on peut y accéder sous un autre nom ??


    -

  5. #5
    Membre émérite
    Avatar de Antoine_935
    Profil pro
    Développeur web/mobile
    Inscrit en
    Juillet 2006
    Messages
    883
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur web/mobile

    Informations forums :
    Inscription : Juillet 2006
    Messages : 883
    Par défaut
    Il n'y a pas vraiment de méthode privée ni protected sous Python. On fait juste appel au bon sens du développeur pour respecter le fait que "2 underscore" signifie privé, et un signifie protected.

    Par contre, la modification du nom a un autre intérêt en cas d'héritage (et encore plus en héritage multiple). Ci dessous, dans le premier exemple, A.val est littéralement perdu, tandis que dans le second exemple, les deux attributs sont conservés.
    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
    30
    31
    32
    33
    >>> class A:
    ...     def __init__(self):
    ...         self.val = 'a'
    ...     def whoami(self):
    ...         print self.val
    ... 
    >>> class B(A):
    ...     def __init__(self):
    ...         A.__init__(self)
    ...         self.val = 'b'
    ... 
    >>> b = B()
    >>> b.whoami()
    b
    >>> dir(b)
    ['__doc__', '__init__', '__module__', 'val', 'whoami']
    >>> 
    >>> class C:
    ...     def __init__(self):
    ...         self.__val = 'c'
    ...     def whoami(self):
    ...         print self.__val
    ... 
    >>> class D(C):
    ...     def __init__(self):
    ...         C.__init__(self)
    ...         self.__val = 'd'
    ... 
    >>> d = D()
    >>> d.whoami()
    c
    >>> dir(d)
    ['_C__val', '_D__val', '__doc__', '__init__', '__module__', 'whoami']

  6. #6
    Membre chevronné
    Inscrit en
    Janvier 2007
    Messages
    329
    Détails du profil
    Informations forums :
    Inscription : Janvier 2007
    Messages : 329
    Par défaut
    Merci à tous pour ces infos ; ça répond aux questions que je me posais.

    Je marque le sujet "réglé".

    @+

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

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