2010-10-15 10 views
7

Niedawno pracowałem nad małym projektem Pythona i doszedłem do sytuacji, w której chciałem przekazać self do konstruktora innego obiektu. Nie jestem pewien dlaczego, ale musiałem sprawdzić, czy jest to legalne w python. Robiłem to wiele razy w C++ i Javie, ale nie pamiętam, żeby to robić w Pythonie.Przekazywanie siebie do konstruktora w pytonie

Czy przekazywanie odniesień do self do nowych obiektów coś, co nie jest uważane za pythonic? Myślę, że nie widziałem żadnych programów Pythona jawnie przekazujących własne odniesienia. Czy do tej pory nie mam takiej potrzeby? Czy walczę w stylu Pythona?

+0

Um, kilka rzeczy są unpythonic * * per se, tylko że tam są zwykle * * lepsze metody (czy o projekt lub poziom wdrożenia). Twoje pytania nie określają problemu, więc nie możemy ocenić, czy twoje rozwiązanie jest dobre. – delnan

+0

Teraz, gdy o tym myślę, muszę się zgodzić, nie robi się tak wiele w Pythonie, jak na przykład w Jawa. Nie mam pojęcia dlaczego. –

+0

Nie wiem, dlaczego ludzie upierają się przy mówieniu "pythonic", gdy po prostu mają na myśli "czyste", ale nie ma w tym nic złego. Po prostu uważaj na odwołania kołowe i "__del__". –

Odpowiedz

12

Tak, to jest legalne, i tak jest pytonickie.

Używam tego wzorca, gdy mamy obiekt i obiekt kontenera, w którym zawarte obiekty muszą wiedzieć o swoim rodzica.

+0

Tak, rozumiem, dlaczego musisz to zrobić, ale po prostu nie jestem pewien, dlaczego nie widziałem go bardzo dużo w Pythonie. – Falmarri

+1

Prawdopodobnie dlatego, że Python ma zły zbiór polimorficznych typów pojemników, które ogólnie są wystarczające dla wszystkich Twoich potrzeb? –

+0

Czy wzorzec adaptera może być uważany za jedno z zastosowań, tzn. Czy nie uznajemy parametru za przekazany jako * self *, ale za inną instancję obiektu, która musi być zawarta. – Ashish

1

Po prostu przepuść go jak parametr. Oczywiście, nie będzie można nazwać self w drugiej inicjatora ...

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

Myślę, że jest to mniej więcej pytanie, czy jego _pythonic_, a nie jak. – alternative

Powiązane problemy