2010-10-15 25 views
7

Je travaillais récemment sur un petit projet python et suis arrivé à une situation où je voulais passer self dans le constructeur d'un autre objet. Je ne sais pas pourquoi, mais j'ai dû vérifier si c'était légal en python. Je l'ai fait plusieurs fois en C++ et Java mais je ne me souviens pas d'avoir jamais fait ça avec python.Passer moi-même dans un constructeur en python

Est-ce que les références à self sont attribuées à de nouveaux objets qui ne sont pas considérés pythonic? Je ne pense pas avoir vu de programmes python en train de passer explicitement des auto-références. Est-ce que je n'ai pas besoin de ça jusqu'à maintenant? Ou est-ce que je combats le style python?

+0

Um, peu de choses sont unpythonic * en soi *, il est juste qu'il ya * habituellement * meilleures approches (que ce soit sur un dessin ou niveau de mise en œuvre). Vos questions ne mentionnent pas le problème, nous ne pouvons donc pas juger si votre solution est bonne. – delnan

+0

Maintenant que j'y pense, je suis d'accord, cela ne se fait pas autant en Python qu'en p. Java. Aucune idée pourquoi, cependant. –

+0

Je ne sais pas pourquoi les gens insistent pour dire "pythonic" quand ils veulent simplement dire "clean", mais il n'y a rien de foncièrement mauvais avec ça. Il suffit de faire attention aux références circulaires et '__del__'. –

Répondre

12

Oui c'est légal, et oui c'est pythonique. Je me trouve en utilisant ce modèle lorsque vous avez un objet et un objet conteneur où les objets contenus doivent savoir sur leur parent.

+0

Oui, je comprends pourquoi vous avez besoin de le faire, mais je ne sais pas pourquoi je ne l'ai pas vu beaucoup en python. – Falmarri

+1

Peut-être parce que python a un ensemble de types de conteneurs polymorphes qui sont en général suffisantes pour tous vos besoins? –

+0

Le modèle d'adaptateur peut-il être considéré comme l'un des usages, je veux dire si nous ne considérons pas le paramètre comme étant * self * mais comme une autre instance d'objet qui doit être contenue. – Ashish

1

Passez-le comme un paramètre. Bien sûr, il ne sera pas appelé self dans l'autre initialiseur ...

class A: 
    def __init__(self, num, target): 
     self.num = num 
     self.target = target 

class B: 
    def __init__(self, num): 
     self.a = A(num, self) 

a = A(1) 
b = B(2) 
print b.a.num # prints 2 
+0

Je pense que cela demande plus ou moins si son _pythonic_, pas comment. – alternative