[python] nevznik objektu
Michal Vyskocil
michal.vyskocil na gmail.com
Čtvrtek Březen 25 08:58:30 CET 2010
18.3.10, David Rohleder <davro na ics.muni.cz>:
> 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.
No tak to nemusí být funkce, ale metoda třídy
class IP(object):
...
@classmethod
def parse(cls, ip):
...
if chyba: return None
objekt = IP.parse("123.456.789.0")
Je to sice trošku Javovský přístup, ale aspoň to nezačíná na class IPFactory :-)
>
>
> > - 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
>
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python
>
--
best regards
Michal Vyskocil
Další informace o konferenci Python