J'aimerais utiliser la capacité de la méta-programmation de Python pour créer des classes par programme. Je peux voir comment mais si l'appel de foo code> peut être instancié ici
type code> se produit dans une fonction? Comment puis-je obtenir
foo code> pour être enregistré de la même manière que
Classe FOO (): Pass code> aurait bien fonctionné? J'aimerais appeler
foo = foo () code> sans entretenir une variable de classe
foo code>. P> p>
3 Réponses :
comme un global: dans le cadre d'un module: p> pour définir une classe de niveau supérieur arbitraire: p>
Et si le nom de la classe foo code> a été stocké dans une variable (réellement tous les paramètres de type
type code> sont stockés comme variables).
Comment puis-je obtenir FOO d'être enregistré de la même manière que
Classe FOO (): Pass code> aurait bien fonctionné? Je voudrais appeler foo = foo () sans entretenir une variable de classe FOO. P> blockQuote>
Eh bien, courte réponse: vous ne pouvez pas. Parce que, en fait, ce que l'instruction code> code> est effectuée consiste à appeler
type () code> et créer une variable par le nom de la classe forte>. Tout simplement, pas de "inscription" ni de la magie noire impliquée. p>
Vous pouvez bien sûr utiliser l'un des hacks d'Amadan pour éviter explicitement em> définir cette variable, mais je ne le conseillerais pas vraiment, car cela ne fera que rendre votre code plus difficile à maintenir. p>
Si vous voulez vraiment le faire, vous pouvez utiliser 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. P> p> globals () code>, qui renvoie le dictionnaire de toutes les variables globales. Mais modifier directement les globaux est
Que veux-tu dire? Enregistré où? Quelle différence rencontrez-vous entre
foo = type ('foo', (), {}) code> et
classe foo: passe code>? Tous deux définissent la variable
foo code>.
Qu'entendez-vous en appelant
foo = foo () code> sans entretenir la variable
foo code>? 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 (...) code>) et utilisez-le pour instancier ultérieurement une classe. Je voudrais juste appeler
foo = foo () code> à partir de la portée actuelle (comme si la classe était définie de la manière standard).
C'est ce que
Global CODE> Mot-clé a > est pour.