0
votes

Enregistrer la classe de métaprogramming

J'aimerais utiliser la capacité de la méta-programmation de Python pour créer des classes par programme. Je peux voir comment foo peut être instancié ici xxx

mais si l'appel de type se produit dans une fonction? Comment puis-je obtenir foo pour être enregistré de la même manière que Classe FOO (): Pass aurait bien fonctionné? J'aimerais appeler foo = foo () sans entretenir une variable de classe foo .


4 commentaires

Que veux-tu dire? Enregistré où? Quelle différence rencontrez-vous entre foo = type ('foo', (), {}) et classe foo: passe ? Tous deux définissent la variable foo .


Qu'entendez-vous en appelant foo = foo () sans entretenir la variable foo ? Que voulez-vous réaliser en le faisant?


J'ai une liste des définitions de classe et j'aimerais créer ces classes, mais je ne veux pas nécessairement conserver la valeur de retour du type (code> ( foo = Type (...) ) et utilisez-le pour instancier ultérieurement une classe. Je voudrais juste appeler foo = foo () à partir de la portée actuelle (comme si la classe était définie de la manière standard).


C'est ce que Global Mot-clé est pour.


3 Réponses :


0
votes

comme un global: xxx

dans le cadre d'un module: xxx

pour définir une classe de niveau supérieur arbitraire: xxx


1 commentaires

Et si le nom de la classe foo a été stocké dans une variable (réellement tous les paramètres de type type sont stockés comme variables).



0
votes

Comment puis-je obtenir FOO d'être enregistré de la même manière que Classe FOO (): Pass aurait bien fonctionné? Je voudrais appeler foo = foo () sans entretenir une variable de classe FOO.

Eh bien, courte réponse: vous ne pouvez pas. Parce que, en fait, ce que l'instruction est effectuée consiste à appeler type () et créer une variable par le nom de la classe . Tout simplement, pas de "inscription" ni de la magie noire impliquée.

Vous pouvez bien sûr utiliser l'un des hacks d'Amadan pour éviter explicitement définir cette variable, mais je ne le conseillerais pas vraiment, car cela ne fera que rendre votre code plus difficile à maintenir.


0 commentaires

0
votes

Si vous voulez vraiment le faire, vous pouvez utiliser globals () , qui renvoie le dictionnaire de toutes les variables globales. Mais modifier directement les globaux est pas recommandé. XXX

Encore une fois, veuillez envisager d'essayer de trouver un autre moyen. En général, vous n'avez pas besoin de métaclasses dans la plupart des cas.


0 commentaires