[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