2010-10-15 19 views
7

Recentemente stavo lavorando a un piccolo progetto python e sono arrivato a una situazione in cui volevo passare self nel costruttore di un altro oggetto. Non sono sicuro del perché, ma ho dovuto cercare se fosse legale in Python. L'ho fatto molte volte in C++ e Java, ma non ricordo di aver mai dovuto farlo con python.Passare self in un costruttore in python

sta passando i riferimenti a self ai nuovi oggetti qualcosa che non è considerato divinatorio? Non penso di aver visto alcun programma Python passare in modo esplicito riferimenti personali. Mi è appena capitato di non averne bisogno fino ad ora? O sto combattendo in stile pitone?

+0

Um, poche cose sono unpythonic * * di per sé, è solo che ci sono di solito * * migliori approcci (sia su un disegno o livello di implementazione). Le tue domande non indicano il problema, quindi non possiamo giudicare se la tua soluzione è positiva. – delnan

+0

Ora che ci penso, devo essere d'accordo, questo non viene fatto tanto in Python come ad es. Giava. Non ho idea del perché, però. –

+0

Non so perché la gente insista nel dire "pythonic" quando significa semplicemente "pulito", ma non c'è nulla di intrinsecamente sbagliato in questo. Basta fare attenzione ai riferimenti circolari e "__del__". –

risposta

12

Sì, è legale e sì è pitonico.

Mi trovo a utilizzare questo modello quando si dispone di un oggetto e un oggetto contenitore in cui gli oggetti contenuti devono conoscere il proprio genitore.

+0

Sì, capisco perché è necessario farlo, ma non sono sicuro del perché non l'ho visto fare molto in Python. – Falmarri

+1

Forse perché il pitone ha un insieme malvagio di tipi di contenitori polimorfici che in generale sono sufficienti per tutte le tue esigenze? –

+0

Può essere considerato uno degli schemi di adattamento, voglio dire se non consideriamo il parametro da passare come * self * ma un'altra istanza di oggetto che deve essere contenuta. – Ashish

1

Basta passarlo come un parametro. Certo, non sarà chiamato self nell'altra inizializzazione ...

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

Penso che questo sia più o meno chiedendo se il suo _pythonic_, non come. – alternative

Problemi correlati