Bienvenue sur IndexError.

Ici vous pouvez poser des questions sur Python et le Framework Django.

Consultez la FAQ pour améliorer vos chances d'avoir des réponses à vos questions.

Methodes magiques , Descripteur, et autres

+2 votes

Je viens de lire l' article de Sam sur les descripteurs :
=> existe t il "quelquechose prévu" qui bidouille les autres méthodes magiques ;
ou est-ce du bricolage au cas par cas ?

Ainsi, un "destructeur" agirait sur del , etc.

La surcharge d' opérateur est elle un cas particulier ?

comment connaitre l'ensemble des méthodes magiques contenues dans un objet ?

demandé 23-Mai-2015 par buffalo974 (2,956 points)

Qu'est-ce que tu veux dire par " "quelquechose prévu" qui bidouille les autres méthodes magiques" ? Quelque chose d'automatique qui changerait plusieurs méthodes magiques à la fois ?

ben quelquechose qui ne s'appelle pas "descripteur", mais qui fait le même type de job sur d'autres méthodes spéciales.
Descripteur est prévu pour modifier get et set
Mon truc myster est prevu pour modifier truc1 et trucX etc

Je ne suis pas sûr de saisir quel aspect des descripteurs tu voudrais retrouver ailleurs.
Comme dit en préambule de l'article que tu cites, on parle de protocole de descripteur (descriptor protocol). Un descripteur ne modifie pas __get__ ou __set__, il les implémentent et c'est leur présence qui va modifier le comportement de "machin.bidule".

3 Réponses

+7 votes
 
Meilleure réponse

La documentation officielle est évidemment une bonne ressource, exhaustive.

Comme on peut le voir, il y a pas mal de méthodes magiques à disposition.

Une grande majorité est effectivement consacrée à la surcharge d'opérateur : les maths mais aussi 'in', '()', '[]'. D'une certaine manière, j'ai envie de dire que les descripteurs permettent de surcharger l'opérateur '.' ; __getattr__, __setattr__ et __getattribute__ aussi mais du point de vue de l'appelant plutôt que de l'appelé.
Dans la même idée, il y a aussi la surcharge de fonctions standards : len(), str(), bool(), hash(), iter(), reversed() ...

D'un autre côté, il y a toute la partie objet comme la vie de l'objet avec __init__, __new__ et __del__ ou encore un cran au dessus __metaclass__.

Et puis il y a le reste comme les 'context manager' et __slots__ par exemple.

répondu 23-Mai-2015 par bubulle (2,256 points)
sélectionné 25-Mai-2015 par buffalo974

lol, t'aurais pu poster quelques phrases cléfs ou un petit exemple =D

T'as pas tort. Voici quelques modifs.

Donc dans le bestiaire bidouille-méthode spéciales , on a identifié:

  • le descripteur qui travaille avec : getattr, setattr et getattribute

  • context manager qui travaille avec : enter() et une méthode exit()

  • le destructeur qui travaille avec : del

Et plein d' anonyme écrits sur le tas, travaillant avec le reste des méthodes spéciales
ou bien ai-je raté un grand classique qui reviendrait souvent ?

Bande de flemmards, les puces c'est fait pour mettre de l'ordre dans le texte, on y voit plus clair, plutôt que d'envoyer un gros bloc de paragraphes impinable ;)

+6 votes

Pour lister les méthodes magiques, ça peut se faire avec dir :

>>> a = dict()
>>> [x for x in dir(a) if x.startswith('__')]
['__class__', '__contains__', '__delattr__', '__delitem__',
'__dir__', '__doc__', '__eq__', '__format__',  ...] # etc ...

Pour mettre un destructeur, c'est avec __del__ que ça se passe. Pour des "destructeurs internes" : on a __delitem__ qui est exécuté quand on fait del foo[2], on a __delattr__ pour del foo.bar.

répondu 23-Mai-2015 par Phynx (298 points)

Perso, je n'utilise jamais ces méthodes pour l'unique raison que visuellement je n'aime pas les doubles tirets ! ;)

0 votes

La surcharge d' opérateur est elle un cas particulier ?

oui : les opérateurs sont interprétés comme des appels aux méthodes magiques qui vont bien. (dans ipython par exemple, 0.__<tab> montre comment y'en a une palanquée.)

Ainsi, un "destructeur" agirait sur del , etc.

C'est prévu, mais pas si intuitif qu'on pourrait le croire : doc officielle py3 Object.__del__. En fait __del__ est appelé juste avant la destruction d'un objet par l'interpréteur. En effet un objet en orienté objet ne peut pas se détruire lui-même, puisque ça ferai appel à une méthode qu'il contiendrait. il faut le détruire de l'extérieur, c'est d'ailleurs pour cela qu'il existe le mot-clef del.

comment connaitre l'ensemble des méthodes magiques contenues dans un objet ?

dir est fait pour cela, les méthodes magiques répondent à la convention de nommage __<untruc>__. Mais tu peux toujours considérer qu'elles sont quasiment toutes présentes, puisqu'elles sont définies sur Object. Par contre, qu'elles fassent effectivement quelque chose d'utile ou de cohérent, c'est pas dit. Il y en a aussi qui n'ont pas de sens pour tous les types de classes (__get__ sur un noniérable on s'en fout un peu...)

expérience : je fais de la transcription de SysML vers du code simulatoire, du coup j'ai plein de cas où les opérateurs travaillent avec des grandeurs physiques et où je dois surcharger les opérateurs/méthodes magiques.

répondu 28-Mai-2015 par Atrament (258 points)
...