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 dateclass 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)
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! ;)