2010-10-15 16 views
7

Hace poco estaba trabajando en un pequeño proyecto de python y llegué a una situación en la que quería pasar self al constructor de otro objeto. No estoy seguro de por qué, pero tuve que buscar si esto era legal en Python. Lo he hecho muchas veces en C++ y Java, pero no recuerdo haber tenido que hacer esto con Python.Pasando yo en un constructor en python

Está pasando referencias a self a objetos nuevos algo que no se considera pythonic? No creo que haya visto ningún programa de Python pasando referencias automáticas. ¿Acaso no tengo la necesidad de hacerlo hasta ahora? ¿O estoy luchando contra el estilo de pitón?

+0

Um, pocas cosas son unpythonic * * per se, es solo que hay por lo general * * mejores enfoques (ya sea en un diseño o nivel de implementación). Sus preguntas no dan nombre al problema, por lo que no podemos juzgar si su solución es buena. – delnan

+0

Ahora que lo pienso, tengo que estar de acuerdo, esto no se hace tanto en Python como en p. Java. Sin embargo, no tengo idea de por qué. –

+0

No sé por qué la gente insiste en decir "pitónico" cuando simplemente quieren decir "limpio", pero no hay nada inherentemente malo en esto. Solo ten cuidado con las referencias circulares y '__del__'. –

Respuesta

12

Sí, es legal, y sí, es pitónico.

Me encuentro utilizando este patrón cuando tiene un objeto y un objeto contenedor donde los objetos contenidos necesitan saber sobre su elemento primario.

+0

Sí, entiendo por qué tienes que hacerlo, pero no estoy seguro de por qué no lo he visto hecho mucho en Python. – Falmarri

+1

Posiblemente porque Python tiene un conjunto malvado de tipos de contenedores polimórficos que en general son suficientes para todas sus necesidades? –

+0

Se puede considerar el patrón de adaptador de canas como uno de los usos, es decir, si no consideramos que el parámetro se pase como * self * sino como otra instancia de objeto que debe contenerse. – Ashish

1

Solo pásalo como un parámetro. Por supuesto, no se llamará self en la otra inicializador ...

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

Creo que esto es más o menos preguntar si es _pythonic_, no cómo. – alternative

Cuestiones relacionadas