[python] nevznik objektu

David Rohleder davro na ics.muni.cz
Čtvrtek Březen 18 20:11:11 CET 2010


Petr Messner píše v Čt 18. 03. 2010 v 17:48 +0100:
> Ahoj
> 
> Že by konstruktor udělal něco tak, aby žádný objekt nevznikl, nejde
> (to není bug). Možností je několik:
> 
>  - vyhazovat výjimku (jak již bylo zmíněno)

musím přiznat, že řešení pomocí výjimek mně přijde jako s kanonem na
vrabce, ikdyž to má svoji logiku. Pokud vnímám výjimku jako nějakou
zásadně chybovou situaci, tak to do této věci nesedí, protože s chybným
vstupem se má počítat a kód by ho měl ošetřovat.

Možná jsem prostě jenom příliš staromódní, začínal jsem programovat v
jazycích, kde výjimky nebyly a python je jazyk, kde se výjimky dají
používat téměř jako lék na cokoliv.

>  - nevolat konstruktor (tedy nevytvářet objekt), ale volat funkci,
> která sama vytvoří objekt, nebo vrátí None - podle mě nejlepší řešení

To zní zajímavě, ale moc mně to nezapadá do takového toho "objektového"
pohledu na svět. Nutno přiznat, že je to asi celkem jedno, z venku
modulu to vypadá stejně jako přímo ten konstruktor objektu.

>  - vytvořit objekt, který při porovnání s False vrátí True (lze
> implementovat přetížením/vytvořením metody __nonzero__)

Tak o __nonzero__ jsem nevěděl. zajímavé.

> 
> BTW. počítáš i s IPv6, že jo? :)

Ne :-) není správně podporován na druhé straně.

D.


> 
> Petr Messner
> 
> 
> 2010/3/18 David Rohleder <davro na ics.muni.cz>:
> > Ahoj,
> >
> > je možné, aby nevznikl objekt, který zrovna vytvářím? Příklad - mám
> > třídu typu IP adresa, v konstruktoru předávám řetězec IPadresy. Chtěl
> > bych, aby v případě, že IP adresa není validní, objekt vůbec nevznikl.
> > Tj. aby konstruktor vrátil None:
> >
> >>>> ipaddr = IP("192.1023.neco.1")
> >>>> ipaddr
> > None
> >
> > chtěl jsem pak třeba udělat:
> >
> > if not ipaddr:
> >        print "zadavas blby vstup"
> >
> >
> >
> > chtěl jsem to vyřešit asi takto:
> >
> > class IP(object):
> >        def __init__(self, IPadresa):
> >                .....
> >                if chyba: return None
> >
> >
> >
> > Jenomže konstruktor vrací vždycky None, tj. touto cestou to nejde.
> >
> > Zatím jediné, co mne napadlo, je vyřešit to pomocí výjimky, tj.např
> >
> > try:
> >        ipaddr = IP("192.168.34536.45")
> > except ValueError:
> >        ipaddr = None
> >
> > Ale myslím, že kdyby objekt vůbec nevznikl, tak by to bylo lepší. Jde
> > to, nebo to nejde?
> >
> > D.
> >
> >
> > --
> > David Rohleder <davro na ics.muni.cz>
> >
> > _______________________________________________
> > Python mailing list
> > Python na py.cz
> > http://www.py.cz/mailman/listinfo/python
> >
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python



Další informace o konferenci Python