Je ne suis pas d'accord avec l'idée que vous ne pouvez pas créer quelque chose de vraiment global en python. en fait, c'est facile. en Python 3.1, il ressemble à ceci:
def get_builtins():
"""Due to the way Python works, ``__builtins__`` can strangely be either a module or a dictionary,
depending on whether the file is executed directly or as an import. I couldn’t care less about this
detail, so here is a method that simply returns the namespace as a dictionary."""
return getattr(__builtins__, '__dict__', __builtins__)
comme un tas d'autres choses, builtins sont un point où PY3 diffère en détail de la façon dont il travaillait dans py2. lisez les documents "Quoi de neuf dans Python X.X" sur python.org pour plus de détails. je n'ai aucune idée de la raison de la convention mentionnée ci-dessus; Je veux juste ignorer ce genre de choses. i pense que le code ci-dessus devrait également fonctionner dans Py2.
donc le point ici est qu'il y a un __builtins__
thingie qui contient beaucoup de choses qui viennent, bien, intégré dans Python. tous les sum
, max
, range
des trucs que vous avez appris à aimer. eh bien, presque tout. mais vous n'avez pas besoin des détails, vraiment. la chose la plus simple que vous pourriez faire est de dire
G = get_builtins()
G[ 'G' ] = G
G[ 'axe' ] = axe
à un point de votre code dont l'exécution est toujours garantie. G
représente l'espace de noms globalement disponible, et depuis que j'ai enregistré G
lui-même dans G
, G
transcende maintenant magiquement son existence dans l'arrière-plan de chaque module. signifie que vous devriez l'utiliser avec soin. Lorsque des collisions de noms se produisent entre tout ce qui est détenu dans G
et dans l'espace de nom d'un module, l'espace de noms du module devrait être gagner (car il est inspecté en premier). aussi, préparez-vous à ce que tout le monde vous saute dessus quand vous leur dites que vous êtes en train de critiquer le DAMMIT du NAMESPACE GLOBAL. Je suis surpris que personne n'en ait encore parlé, ici.
Eh bien, ces gens auraient raison, d'une certaine façon. Personnellement, cependant, c'est une de mes principales techniques de composition d'application: ce que vous faites, c'est vous éloigner du module polyvalent (qui ne devrait pas faire une telle chose) vers un espace de noms spécifique à l'application. vos modules sont tenus de ne pas travailler en dehors de cet espace de noms, mais ils ne le sont pas non plus. J'ai effectivement commencé ce style de programmation comme une rébellion expérimentale contre (1) les vues établies, hah !, et (2) le désespoir qui me frappe chaque fois que je veux accomplir quelque chose de moins que trivial en utilisant l'instruction import
de Python. ces jours-ci, je n'utilise que import
pour les bibliothèques standard et les modules installés régulièrement; pour mes propres affaires, j'utilise un système interne. que puis-je dire, ça marche!
ah oui, deux autres points: faites-vous une faveur, si vous aimez cette solution, et écrivez-vous une méthode publish()
ou similaire qui vous permet de ne jamais publier un nom qui a déjà été pris. Dans la plupart des cas, vous ne le voulez pas. Enfin, permettez-moi d'appuyer le premier commentateur: j'ai programmé exactement le style que vous montrez ci-dessus, parce que c'est ce que vous trouvez dans les exemples de manuels (la plupart du temps en utilisant car
s, pas axe
s pour être sûr) . pour un nombre assez important de raisons, j'ai à peu près abandonné à ce sujet. Considérons ceci: JSON ne définit que sept types de données: nul, vrai, faux, nombres, textes, listes, dictionnaires, c'est tout. Je prétends que vous pouvez modéliser tout autre type de données utile avec ceux-ci.
Il y a encore beaucoup de justification pour des choses comme des ensembles, des sacs, des dictionnaires ordonnés et ainsi de suite. la revendication ici n'est pas qu'il est toujours commode ou approprié de se rabattre sur une forme pure, directement compatible avec JSON; l'affirmation est seulement qu'il est possible de simuler. en ce moment, je suis l'implémentation d'une liste clairsemée pour une utilisation dans un système de messagerie, et que type de données i faire mettre en œuvre dans OOP classique. c'est pour ça que c'est bon.
mais je ne définis jamais de classes qui vont au-delà de ces types de données génériques. J'écris plutôt des bibliothèques qui prennent des types de données génériques et qui fournissent la fonctionnalité dont vous avez besoin. toutes mes données d'affaires (dans votre cas, probablement des représentations de joueurs, des scènes, des outils et ainsi de suite) vont dans un conteneur de données génériques (en règle générale, dict
s). Je sais qu'il y a des questions ouvertes avec cette façon d'architecturer les choses, mais la programmation est devenue tellement plus facile, tellement plus fluide puisque j'ai cassé la BS que la partie de la propagande OOP est (en dehors des choses vraiment utiles et agréables qu'une autre partie de POO est).Oh oui, et ai-je mentionné que tant que vous conservez vos données professionnelles dans des objets compatibles JSON, vous pouvez toujours les écrire et les ressusciter à partir du disque? ou les envoyer sur le fil de sorte que vous pouvez interagir avec des joueurs à distance? et comment incroyablement tordu l'activité de sérialisation peut devenir dans OOP classique si vous voulez faire cela (lire this pour la pointe de l'iceberg)? La plupart des détails techniques que vous devez connaître dans ce domaine sont totalement insignifiants pour le reste de votre vie.
Si vous êtes juste stocker un tas de propriétés, vous pouvez utiliser un dictionnaire. – Seth
Vous n'avez pas besoin d'une classe globale pour y parvenir, utilisez simplement la notation 'module.class' de Python pour accéder à la classe à partir d'autres modules du paquet. –