Le partage de variables globales entre les classes en Python
Je suis relativement nouveau à la pensée de python en termes de programmation orientée objet, et ça avance assez lentement pour moi.
Est-il possible de passer des variables globales entre les classes avec de multiples fonctions? J'ai beaucoup lu ici et dans d'autres sources, mais je suis encore un peu confus.
Mon but ultime est de définir une variable à l'échelle mondiale, de lui attribuer une valeur en fonction d'une classe, puis l'UTILISER dans une autre classe de fonction. Est-ce possible? Je suis en train de construire un pythonaddin pour ArcMap, ce qui nécessite une classe pour chaque bouton. Je veux avoir un bouton pour assigner une valeur à une variable, et ensuite utiliser cette variable dans une autre classe dans le script.
(Avant que je la flak, je sais que c'est relativement mauvaise forme à utiliser des variables globales, en premier lieu, je suis en train d'apprendre)
Par exemple, comme un exemple simplifié:
x = []
class A():
def func_1(self):
#populate the x variable
global x
x = 1
class B():
def func_2(self):
global x
#do stuff with x
Est-ce acceptable (même si pas pythonic)?
Vous ne devez utiliser le mot clé global si vous allez modifier la variable en question.
OriginalL'auteur user22861 | 2013-11-24
Vous devez vous connecter pour publier un commentaire.
Oui, il peut travailler. Voici le code modifié:
Il peut imprimer la liste
x
correctement. Lorsque c'est possible, vous devriez essayer d'éviter les variables globales. Vous pouvez utiliser de nombreuses autres façons de passer des variables entre les classes plus efficacement et en toute sécurité.PS: Notez les paramètres dans les fonctions.
Oh, attendez, je viens de pensé à elle. C'est juste une question de sauver une variable auto.x et puis l'appel de la B. x plus tard. Merci pour les conseils!
Je pense que vous pouvez initialiser une autre classe dans une classe. Puis utiliser les variables dans une autre classe à l'aide de ses fonctions. Tout comme
class A: def __init__(self): self.another = B()
Exactement, vous avez raison! Vous êtes les bienvenus!
OriginalL'auteur Old Panda
Oui, c'est possible. Votre code est presque droit, manque juste un couple de parenthèses dans les définitions de fonction. Autre que cela, il fonctionne.
C'est que maintenant acceptable? Dans 99% des cas, non, il n'est pas. Il y a de nombreuses façons de passer des variables et de partage des données entre les classes, et l'utilisation de variables globales est un des pires, si ce n' le pire.
Main
classe avec__init__
, qui est défini par défaut var pour tous "enfant" cours && méthodes? Est-il la solution? P. S. Dans mon cas tous les de var seraconst
, je veux dire, ils wil lsetup une fois le script lancé, et ne change pas jusqu'à la fin.OriginalL'auteur José Tomás Tocino
Plus Pythonic solution serait d'avoir le bouton d'objets (dans leur méthode qui traite de la "presse" de l'événement) définir un attribut ou d'appeler une méthode d'un objet a besoin de l'information.
Vous devez créer une instance de la classe cible, par exemple, nommé
spam
(exemple, pas de classe) dans son module par exempleeggs
. Dans le module qui utilise les boutons, vous serait alors fairefrom eggs import spam
.OriginalL'auteur Roland Smith