[python] nevznik objektu
Hynek Fabian
hynek.fabian na firma.seznam.cz
Čtvrtek Březen 18 18:12:37 CET 2010
IMO vyjimka je asi nejlepsi zpusob jak tyhle veci resit, protoze je to objekt
do kteryho muzes pridat vic informaci nez jen "error"
Jestli ale mermomoci chces sabotovat konstrukci objektu, tak hledas metodu
__new__(), zhruba takhle:
class IP(object):
def __new__(cls, ip, *args):
if "." in ip:
return object.__new__(cls, ip, *args)
else:
return None
def __init__(self, ip):
self.ip = ip
Od __new__ se ocekava ze vrati hotovou instanci na ktere je pak zavolan
__init__(), ale v interpretru je hacek - pokud vraceny objekt neni potomkem
konstruovaneho typu, init se nevola.
Z toho je videt proc ti nefunguje vraceni None z initu - v tu chvili uz je
objekt davno zkonstruovany. Jinak by ostatne init nemohl dostat self!
David Rohleder (čtvrtek 18 Březen 2010 17:41:42):
> 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.
Další informace o konferenci Python