Przykład wykorzystania metody __new__

Wt, 2 Czerw 2009 17:56:44 +0200

W jednym projekcie potrzebowałem generować obiekt danego typu w zależności od dnia. Chcąc uniknąć bawienia się w krzyżówkę ifów i elifów postanowiłem skorzystać ze statycznej metody new która jest dostępna w każdej klasie nowego typu. Metoda ta jest wywoływana przed init, oraz powinna zwracać instancję oczekiwanego obiektu. Najprościej mówiąc, dzięki niej mamy możliwość wpłynąć na typ obiektu, a wraz z użyciem metaklas – otrzymujemy nieograniczony wachlarz operacji na dopiero co tworzonym obiekcie, wręcz typie obiektu.

Przykład postanowiłem zamieścić ponieważ zostałem poproszony niedawno o wyjaśnienie różnic i między init a new ;)

#!/usr/bin/env python                                      
from datetime import date                                  

class GenericDayOfWeek(object):
working = True
class Monday(GenericDayOfWeek):
pass
class Tuesday(GenericDayOfWeek):
pass
class Wednesday(GenericDayOfWeek):
pass
class Thursday(GenericDayOfWeek):
pass
class Friday(GenericDayOfWeek):
pass
class Saturday(GenericDayOfWeek):
working = False
class Sunday(GenericDayOfWeek):
working = False
days = (Monday, Tuesday, Wednesday, Thursday, Friday, Saturday, Sunday)
class DayOfWeek(object):
def new(cls):
weekday = date.today().weekday()
return cls.new(days[weekday])
if name == ’main’:
day = DayOfWeek()
print day.working
print type(day)

Komentarzy: 4

Eluś: Twój system formatowania składni najprawdopodobniej wykorzystuje podwójne podkreślniki, przez co brak ich w kodzie. Jak rozumiem na to pytanie udzieliłeś poprawnej odpowiedzi? :)

bluszcz: Poprawność odpowiedzi określany pytający, więc może być to względne ;) ale raczej tak. Co do formatowania - textile wyczynia mi cuda, i te nieszczęsne nadmiarowe entery :( Pracuję nad tym...

M.: Nie wiem jak wyglada oficjalny stan wiedzy ogolnej o __new__ i __init__, ale jak juz wrzucasz takie smaczki(bo ladny ten kodzik) to moze warto pokusic sie o wersje anglojezyczna bloga?:)

bluszcz: kocham polska pikny kuwa jenzyk, polska dla polaków! ;)