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 :

Questions techniques, utilisations -> LES MÉTACLASSES


Sujet :

Python

  1. #1
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut Questions techniques, utilisations -> LES MÉTACLASSES
    Bonsoir,

    Après des questions globales concernant le langage python, j'arrive avec une conception (très) technique : Les métaclasses.

    Quand utiliser les métaclasses ?

    Souvent dans mes réponses aux questions concernant les métaclasses, je répond par la citation suivante (Tim Peters).

    Metaclasses are deeper magic than 99% of users should ever worry about. If you wonder whether you need them, you don't (the people who actually need them know with certainty that they need them, and don't need an explanation about why).
    Je la trouve tellement vraie, mais avant de donner votre avis, je vais donner le mien, ça se discute et selon vos créations pythoniques, il est selon moi possible de comprendre que certains codeurs l'utilisent (régulièrement ? Non, je vous crois pas...)

    Les métaclasses selon mes lectures, mes utilisations auraient trois intérêts majeurs

    1. Assimiler/gérer lors de la création de classe (pas instance)
    2. Créer dynamiquement une classe (Mouais, ...)
    3. Modifier une classe

    Alors voyez-vous je suis mitigé sur son utilisation à mon niveau, mais je suis sûr que certains codeurs l'utilisent dans un but précis.


    Ce qui serait intéressant, c'est de savoir dans quelle situation vous les utilisez et en quoi son utilisation vous a simplifiez la vie (le code).


    La métaclasse, je la vois de cette façon

    • métaclasse -> classe
    • classe -> instance

    Je considère donc que cette fois la classe en rapport avec la métaclasse n'est pas un constructeur d'objet, mais l'objet lui même.


    Comme je vois la classe comme le créateur/modeleur/moule/schéma de l'objet (son instance).


    Création de classe dynamique


    Parlons syntaxe, n'ayant pas de grandes expériences dans la création de classe, peut-être y a-t-il d'autres habitudes de création, et de façon de faire.


    En ce qui me concerne j'utilise type, mais il me semble qu'on peut utiliser __new__, seulement je suis loin d'en être un adepte. Bien, pas bien, ça se discute...


    D'autres méthodes de création de classe, venez les présenter ici.


    Tiens, en cherchant la documentation pour type, que vois-je ?


    Conclusion


    Une métaclasse est une classe de classe... Vrai, faux? Pourquoi?


    Merci pour votre participation...
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  2. #2
    Expert éminent
    Avatar de tyrtamos
    Homme Profil pro
    Retraité
    Inscrit en
    Décembre 2007
    Messages
    4 461
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2007
    Messages : 4 461
    Points : 9 248
    Points
    9 248
    Billets dans le blog
    6
    Par défaut
    Bonjour,

    D'après ce que j'ai compris, l'exécution d'une classe implique toujours la metaclasse "type" pour les classes de nouveau style et "types.ClassType" pour les classes de l'ancien style. Et on peut créer des metaclasses personnalisées, généralement obtenus par sous-classement de "type". Bref, on touche la machinerie interne de Python.

    En fait, jusqu'à présent, je crois en connaître suffisamment pour savoir que je n'en ai pas besoin. Mais la curiosité peut me pousser à suivre avec intérêt la suite de ce fil...
    Un expert est une personne qui a fait toutes les erreurs qui peuvent être faites, dans un domaine étroit... (Niels Bohr)
    Mes recettes python: http://www.jpvweb.com

  3. #3
    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,

    Une metaclass permet d’accéder a des "hooks" (__new__, __init__,...) pour effectuer des opérations spécifiques pendant la séquence d'initialisation d'une classe ou d'une instance (le __call__ de la metaclass appellera le __new__).

    Quelques rares opérations ne peuvent se faire qu'a ces moment la.

    Comme la séquence d'initialisation d'une instance passera par le __new__ de la classe et que Python est laxiste: la plupart des opérations pourront être déclenchée a ce moment la.

    Pour ce qui est des cas d'utilisation, il faut arriver a se mettre dans une perspective "cycle de vie" de ces objets.

    Les instances sont créées et détruites lors de l’exécution du programme.

    Par défaut, une classe sera créée au chargement du programme/module qui contient sa définition et sera détruite a la sortie du programme.
    On dira que ce sont des classes "statiques".

    type permet de créer dynamiquement une classe. On peut juste définir les classes parentes et son namespace. Le reste se passera lors de l’exécution des "hooks" s'ils sont définis.

    On a deux dimensions dynamique/statique vs. customisation ou pas des séquences d'initialisation.

    On peut faire des tas de trucs avec les metaclass ça mais les cas d'utilisation sont trop compliques a raconter.
    Il a pas mal de framework Python qui utilisent ça. Regardez les sources de SQLAlchemy, vous y trouverez pleins de cas d'utilisation sympa (attention aux maux de tête).

    Les cas d'utilisation pour les classes dynamiques sont plus accessibles.
    Prenez un Canvas Tk. Ses items sont des /iid/ (des entiers).
    Associez leur une classe Item.
    Elle aura les attributs /iid/ et /canvas/.

    Intuitivement /canvas/ pourrait être un attribut de la classe des Item de ce canvas (plutôt qu'attribut de chaque instance).
    type permettra de créer une s/classe d'Item associée a chaque instance de Canvas.

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

  4. #4
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    @Wiztricks

    Salut, je te remercie de ta réponse complète et comme on en est à parler comme le dit Tyrtamos à la partie fonctionnelle interne à python, j'ai relevé une de tes phrases pour que tu m'en dises un peu plus.

    Citation Envoyé par wiztricks
    Comme la séquence d'initialisation d'une instance passera par le __new__ de la classe et que Python est laxiste
    J'ai déjà entendu parler de ce laxisme de notre langage préféré, mais j'ai jamais trop pigé où il apparait exactement, sans doute par manque d'expérience et de pratique.

    Peut-être si tu pouvais détailler laxisme, je comprendrais mieux où tu veux en venir exactement. Qu'est-ce qui fait que ces opérations peuvent être déclenchées au moment de la création? D'autres langages comme le C++, java, langages OO ne le permettent pas ?

    Citation Envoyé par wiztricks
    On a deux dimensions dynamique/statique vs. customisation ou pas des séquences d'initialisation.
    Ok, mais par rapport au cycle de vie, tu classeras les termes

    • statique
    • dynamique
    • "custom"

    de quelle manière ?

    Citation Envoyé par wiztricks
    On peut faire des tas de trucs avec les metaclass ça mais les cas d'utilisation sont trop compliques a raconter.
    Ça je peux le comprendre aisément

    Ma question (plus précise) est : à partir de quel moment tu choisiras d'utiliser une métaclasse plutôt que le fonctionnement standard (classe-> instance->...) ?

    Merci par avance de tes éclaircissements (surtout "cycle de vie", ça m'a bien fait percuter pour certaines choses, mais j'aimerais aller plus loin et sans me planter)

    P.S Rien ne t'empêche si tu vois une bonne documentation explicative, de la partager
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  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
    Salut Fred,

    J'ai déjà entendu parler de ce laxisme de notre langage préféré, mais j'ai jamais trop pigé où il apparait exactement, sans doute par manque d'expérience et de pratique.
    Je suppose que vous avez entendu parle des différences entre:
    • langages scriptes et compiles,
    • typage statique ou dynamique,

    Dans la vraie vie, ça a des implications sur la fiabilité du code.
    Autrement dit sur des risques que vous acceptez ou pas de prendre.

    Ce "laxisme" est inhérent a tout langage scripte.
    Mais, c'est ce qui fait leur intérêt - pourvu que vous sachiez quand il sera pertinent ou pas de les utiliser.
    Et ce risque est gérable via l'utilisation de techniques différentes de celles qu'on utilise dans les langages "classiques" (mais il faudra convaincre client, sécurité, assurance qualité, patrons,... des tas de gens demanderont pourquoi ne pas prendre du compile/typage statique comme on le fait d'habitude)

    On peut essayer de trouver des exemples qui "parlent" mais je ne suis pas certain que cela vous permette de mieux comprendre tout en risquant de voir cela dénatures par un sophiste pour faire "jaser" la foule.

    Le PEP8 recommande d'utiliser "_" pour préfixer les attributs protégés d'un objet. C'est une convention. Vous la respectez parce que vous êtes un adulte responsable... ou pas.

    Dans un cadre contractuel exigeant, on ne pourra pas se contenter de faire "confiance", il faudra pouvoir "interdire", "contrôler".

    Alors que Python dit "débrouillez vous", un langage "compilée" proposera des solutions "standards" qu'il suffira de mettre en œuvre.
    Mais on peut faire avec Python des solutions "ad hoc"...

    Envoyé par wiztricks
    On a deux dimensions dynamique/statique vs. customisation ou pas des séquences d'initialisation.Ok, mais par rapport au cycle de vie, tu classeras les termes
    • statique
    • dynamique
    • "custom"

    de quelle manière ?
    Si la notion de cycle de vie vous est aussi étrangère, ca va pas etre facile. Comment redire ca?
    Ecrivons:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    class A: pass
    def foo():
        a = A()
        B = type('B', (A,), {})
    Lorsque l’interpréteur lit le script, seront définis les objets class A et function foo.

    C'est "statique" parce que, c'est le contenu du script (votre programme). A chaque lancement du programme, l'import du module créera les mêmes objets sans qu'on ait a fait quoi que ce soit.

    A chaque appel de la fonction "foo", on crée une instance de A et une s/classe B de A. Comme ces objets ne sont références que par des variables locales, ils seront détruits après la sortie de la fonction.

    "customisation ou pas des séquences d'initialisation" est sans rapport avec "cycle de vie" mais a ce qui se passe lorsqu'une classe ou une instance est crée.

    P.S Rien ne t'empêche si tu vois une bonne documentation explicative, de la partager
    Sous Google "Python metaclass example", on trouve:


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

  6. #6
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Merci wiztricks,

    Ok, en fait rien de vraiment nouveau pour moi dans ce que tu dis, j'avais pensé cela autrement, un manque de concentration lors de la lecture précédente sans doute, par contre les liens sont très bien, je prend.
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

  7. #7
    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 fred1599 Voir le message
    Ok, en fait rien de vraiment nouveau pour moi dans ce que tu dis, j'avais pensé cela autrement
    Il faut peut être prendre de la hauteur pour mieux comprendre l’intérêt de ces trous de souris.

    J'ai peur que ça plane un peu "haut" (pour les debutants) mais dans les tutos/cours du forum conception vous en avez qui couvrent MDA (model driven architecture).

    Les cas d'utilisation des meta-modèle/meta-classe découlent de tas de travaux sur la modélisation. C'est un vaste sujet qui est couvert +/- bien dans les cursus de formation des ingénieurs.

    Si le voyage vous tente.
    - W
    Architectures post-modernes.
    Python sur DVP c'est aussi des FAQs, des cours et tutoriels

  8. #8
    Expert éminent
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    3 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 817
    Points : 7 110
    Points
    7 110
    Par défaut
    Je lirais ça à tête reposée (il le faut), ça à l'air "différent"...

    Nous verrons bien si ça passe

    Merci
    Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.(Bachelard)
    La connaissance s'acquiert par l'expérience, tout le reste n'est que de l'information.(Einstein)

Discussions similaires

  1. Réponses: 6
    Dernier message: 02/08/2013, 09h22
  2. [Info] Les questions techniques dans les bons forums !
    Par Manumation dans le forum Mode d'emploi & aide aux nouveaux
    Réponses: 3
    Dernier message: 23/01/2008, 00h49
  3. Réponses: 7
    Dernier message: 02/01/2008, 14h32
  4. Question technique sur les listes déroulantes
    Par kenny49 dans le forum Langage
    Réponses: 3
    Dernier message: 18/04/2007, 10h41
  5. Question techniques sur les extents
    Par lecharcutierdelinux dans le forum Oracle
    Réponses: 16
    Dernier message: 24/08/2006, 09h01

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