2012-10-11 12 views
5

Rozumiem, co robi __new__ (i jak to jest inne niż __init__), więc nie interesują mnie definicje, interesuje mnie kiedy i jak używać __new__.Jakie są przypadki użycia dla __new__ w Pythonie?

Dokumentacja mówi:

Na ogół nie ma potrzeby, aby zastąpić __new__ chyba jesteś instacji jest niezmienna typu jak str, int, unicode lub tuple

ale mogę pomyśl o innych przypadkach użycia __new__ lub o tym, jak z niego korzystać poprawnie (na przykład przy podklasowaniu niezmiennego typu lub dlaczego jest to potrzebne w tym przypadku).

Kiedy, dlaczego i jak należy korzystać z __new__?

Jestem zainteresowany przypadkami użycia, a nie tym, co robi (wiem, co robi).

+2

@McFarlane: Wiem o tym, interesują mnie sytuacje, w których trzeba używać __new__ (więcej niż to wyrażenie z "podklasy niezmiennego typu". ** To nie jest duplikat. ** – JohnDoDo

+1

@ Zamknij głosujących To nie jest duplikat. Zadane pytanie pyta * dlaczego '__init__' jest zawsze wywoływane po' __new__' * (to nie jest) .To pytanie wymaga praktycznych przypadków użycia '__new__'. Odpowiedź na to pytanie nie jest odpowiedzią dla –

+0

@lazyr: mam nadzieję, że nie masz nic przeciwko, Włączyłem Twój komentarz na pytanie: Dzięki! – JohnDoDo

Odpowiedz

10

Odpowiadając na siebie, użyłem go do

  • utworzyć Singleton (choć istnieją ways to zrobić bez użycia __new__)
  • dynamically extend classes from external modules bez faktycznie edycji źródła
  • klas dostosować w metaclassie (chociaż może być również użyty __call__, myślę)
  • przedłużyć klasę datetime.datetime (która jest niezmienna), aby zwrócić bieżący czas, jeśli został zainicjowany bez argumentu mentów oraz wynikiem nazywając strptime na argumencie, jeśli wywołana z jednym argumencie

co potrzeba __new__ gdy instacji typ niezmienny, jeśli chcesz zmienić argumenty użyte do skonstruowania niezmienna, ponieważ chciałem w datetime przykład, lub jeśli nie chcesz w ogóle wywoływać funkcji rodzica __new__, ale zwróć instancję utworzoną w inny sposób lub nawet całkowicie inny typ. Do czasu, gdy jesteś w __init__ jest za późno, aby zmienić obiekt w jakikolwiek sposób, więc musisz to zrobić w __new__.

+0

Wielkie dzięki za to! – JohnDoDo

0

Potencjalnym przypadkiem użycia może być "klasa fabryczna", która zwraca instancje różnych klas w zależności od implementacji.

Powiązane problemy