python: créer une instance de la classe dans une autre classe (exemple générique)
Je suis en train d'apprendre python via le livre et internet et je suis bloqué sur une question de classe.
2 questions:
- Comment puis-je créer une instance d'une classe dans une autre (séparée) de la classe?
- Comment puis-je passer des variables entre la classe et le imbriquée(?) classe?
Lorsque j'essaie de créer une instance d'une classe dans une autre (séparée) de classe, je suis en mesure de le faire à l'intérieur d'une méthode. Voici le code:
import os
class FOO():
def __init__(self):
self.values = [2, 4, 6, 8]
def do_something(self, x, y):
os.system("clear")
z = self.values[x] * self.values[y]
print "%r * %r = %r" % (self.values[x], self.values[y], z)
class BAR():
def __init__(self):
pass
def something_else(self, a, b):
foo1 = FOO()
foo1.do_something(a, b)
bar = BAR()
bar.something_else(1, 2)
Sera-ce, cependant, permettez-moi d'accéder à la classe FOO et c'est l'information dans la BARRE d'autres méthodes? Si oui, comment?
J'ai essayé ce qui suit, et vous avez une erreur:
import os
class FOO():
def __init__(self):
self.values = [2, 4, 6, 8]
def do_something(self, x, y):
os.system("clear")
z = self.values[x] * self.values[y]
print "%r * %r = %r" % (self.values[x], self.values[y], z)
class BAR():
def __init__(self):
foo1 = FOO()
def something_else(self, a, b):
foo1.do_something(a, b)
bar = BAR()
bar.something_else(1, 2)
Voici l'erreur:
Traceback (most recent call last):
File "cwic.py", line 22, in <module>
bar.something_else(1, 2)
File "cwic.py", line 19, in something_else
foo1.do_something(a, b)
NameError: global name 'foo1' is not defined
Je reçois la même erreur lorsque j'ai utilisé:
def __init__(self):
self.foo1 = FOO()
Aussi, comment dois-je transmettre les "valeurs" d'une classe à l'autre?
S'il vous plaît laissez-moi savoir si mon approche générale et/ou de syntaxe sont mauvais. Toutes les suggestions de bienvenue (y compris les bons de lecture), comme je suis juste à l'apprentissage. Merci.
OriginalL'auteur dwstein | 2012-08-17
Vous devez vous connecter pour publier un commentaire.
Tous les attributs d'une instance ou d'une classe sont accessibles via
self
qui est passé comme premier argument à toutes les méthodes. C'est pourquoi vous avez correctement obtenu la signature de la méthodesomething_else(self, a, b)
plutôt que de simplementsomething_else(a, b)
comme vous le feriez avec d'autres langues. Si vous êtes à la recherche pour:Notez que l'auto n'est pas un mot clé, c'est juste un paramater nom comme
a
etb
, de sorte que vous pourriez par exemple être tentés de l'utiliserthis
à la place si vous êtes à partir d'un Java de fond... Ne pas bien! il y a un très fort convention à utiliserself
à cette fin, et vous aurez beaucoup de personnes (y compris vous-même, en fin de compte très en colère si vous utilisez autre chose!En ce qui concerne la transmission de valeurs, je ne suis pas sûr de ce que tu veux dire, vous pouvez y accéder par le biais des instances telles que
foo1.an_attribute
ou les passer comme arguments aux fonctions comme dansfunction(arg)
mais vous semblez avoir utilisé les deux techniques dans votre exemple, donc je ne suis pas sûr de ce que vous êtes après...Modifier
En réponse à @dwstein commentaire, je ne suis pas sûr de savoir comment il est fait en VB mais voici comment vous transmettre des arguments lors de la création d'une instance d'une classe.
Si l'on regarde votre classe:
Nous pouvons changer cela pour accepter un argument baz par l'évolution de la deuxième ligne de
def __init__(self, baz):
et puis, si on veut, on peut fairebaz
un attribut de notre nouvelle instance deBAR
par la mise enself.baz = baz
. Espérons que cela aide.OriginalL'auteur redrah
En python, vous devez toujours utiliser la fonction "auto" préfixe lors de l'accès à des membres de votre instance de classe. Essayez
OriginalL'auteur Zvi
Vous êtes sur la bonne voie, essayez:
OriginalL'auteur Bi Rico
Je ne suis pas sûr si je comprends bien votre question, qui est plus un reflet de moi que de vous. Si je comprends bien ce que vous cherchez, vous souhaitez créer une instance d'une classe dans une méthode de classe. Maintenant, je pourrais être le " chemin hors de la base ici, donc, si cela est source de confusion, il se peut que je réponds à une autre question qui est de ta question.
Ce que ce programme est de créer une classe,
MyClass
, qui a un objet de classe,instance_list
.instance_list
va être une liste d'instances. méthode de la classemake_instances
ne fait que cela: il crée des instances et remplitinstance_list
. À la fin du programme, j'ai créeran_instance
la façon dont l'un serait "normalement" créer une instance. Doncan_instance
est un objet de la classeMyClass
.J'espère que cela est utile
OriginalL'auteur user1928764