[python] =?iso-8859-2?q?=5Bpython=5D=09T=F8=EDda?=, která vytvoří instanci jen pokud tam už není instance se stejnými parametry

Hynek Fabian hynek.fabian na firma.seznam.cz
Čtvrtek Červenec 22 15:54:53 CEST 2010


Kdyz se tvori nova instance, zavola se __new__()
prvni arg je trida, zbytek jsou argumenty predany konstruktoru
Zabudovana implementace __new__ obstara alokaci pameti a takovy ty nezajimavy 
veci a vytvori opravdovou, nefalsovanou instanci. Ta je pak predana do 
__init__() jako 'self' argument. Nic vic na tom neni.

Kdyz do toho chces nejak zasahnout, staci ve spravny okamzik zavolat 
object.__new__(cls) ktery obstara alokaci pameti a vrati ti novou instanci 
typu cls - v podstate jen prazdny jmenny prostor, se kterym si mzues delat co 
chces. Naivkove takhle tvori singleton :-)
__init__() volat nemusis - pokud volani __new__ vrati jakoukoliv (nova, stara, 
potomek, vsechno jedno) instanci cls, interpretr ho zavola sam. Pokud ven 
vyleze jiny objekt, bude se povazovat za vysledek konstrukce jako by se nic 
zvlastniho nedelo, ALE jeho __init__ se nezavola - predpoklada se, ze uz je 
zkostruovany cili by se volal podruhe.


MICHÁLEK Jan Mgr. (čtvrtek 22 Červenec 2010 15:25:56):
> Všem děkuju za rady, du to vyzkoušet, mám tu dva různý přístupy, ale ani
> jeden uplně nechápu, nicméně s pomocí Googlu si to snad rozpitvam.
> 
> Vřelý díky
> 
> (teda pánové, mam z Vás mindrák, na tohle bych sám asi nepřišel)
> 
> -----Original Message-----
> From: python-bounces na py.cz [mailto:python-bounces na py.cz] On Behalf Of Tomáš
> Drenčák Sent: Thursday, July 22, 2010 3:21 PM
> To: Konference PyCZ
> Subject: Re: [python]Třída, která vytvoří instanci jen pokud tam už není
> instance se stejnými parametry
> 
> Aha, tak po dostudovani pojmov to nie je pouzitie metaclass ale len __new__
> metody. Tato metoda je zodpovedna za vytvorenie novej instancie objektu.
> Priklad ale zostava platny
> 
> 2010/7/22 Tomáš Drenčák <tomas na drencak.com>:
> > No ja by som pouzil metaclass (staci definovat metodu __new__), vid
> > priklad:
> > 
> > xxx = {}
> > class Xxx(object):
> >    def __new__(cls, param):
> >        global xxx
> >        if param not in xxx:
> >                xxx[param] = super(Xxx, cls).__new__(cls, param)
> >        return xxx[param]
> > 
> >    def __init__(self, param):
> >        self.param = param
> > 
> > 3077417100
> > 3077417228
> > 3077417100
> > 
> > Vypise
> > 3077417100
> > 3077417228
> > 3077417100
> > 
> > V kode potom nemusis nic menit...
> > 
> > 2010/7/22 MICHÁLEK Jan Mgr. <Michalek.Jan na uhul.cz>:
> >> Ten slovník tam mám, já to umím zachytit, ale neumim udělat to, aby
> >> se ta instance nevytvořila přes init, šlo by udělat
> >> 
> >> z1= Zvire.pridejZvire('hroch') #a ta metoda bz se podivala do
> >> slovniku a buď hotovýho hrocha vrátila, nebo udělala fungl novýho
> >> 
> >> ale to já nechci, já to chci dělat
> >> 
> >> z1 = Zvire('hroch')
> >> 
> >> kdybych to narval do nový tridy tak si stejne nepomuzu, udela se tak
> >> jako tak nova instance.
> >> ________________________________
> >> From: python-bounces na py.cz [mailto:python-bounces na py.cz] On Behalf Of
> >> Juda Kaleta
> >> Sent: Thursday, July 22, 2010 2:59 PM
> >> To: Konference PyCZ
> >> Subject: Re: [python] Třída, která vytvoří instanci jen pokud tam už
> >> není instance se stejnými parametry
> >> 
> >> Vhodné by bylo mít na vytváření těchto objektů nějakou továrničku -
> >> ta by obsahovala slovník s již vytvořeními instancemi ({'pes':...,
> >> 'hroch':...}). Při volání metody k vytvoření nového objektu by se
> >> kouklo do
> >> slovníku, pokud by tam již objekt s tímto klíčem byl, vrátil by se
> >> ten, pokud ne, vytvořil by se nový objekt.
> >> 
> >> Juda Kaleta
> >> 
> >> E-mail: juda.kaleta na gmail.com
> >> Jabber: yetty na jabber.cz
> >> 
> >> Dne 22.7.2010 14:50, MICHÁLEK Jan Mgr. napsal(a):
> >> 
> >> Otázka:
> >>   je možné napsat třídu tak, aby vytvořila instanci, jen pokud ještě
> >> instance se stejnými parametry ještě neexistuje.
> >> 
> >> Např:
> >>   mám třídu zvíře a chtěl bych, aby se chovala následujícím způsobem
> >> 
> >>>>> z1 = zvire('hroch')
> >>>>> z1
> >> 
> >> <__main__.zvire instance at 0x017C1EE0>
> >> 
> >>>>> z2 = zvire('pes')
> >>>>> z2
> >> 
> >> <__main__.zvire instance at 0x017C1760>
> >> 
> >>>>> z3 = zvire('hroch')
> >>>>> z3
> >> 
> >> <__main__.zvire instance at 0x017C1EE0>
> >> 
> >> 
> >> Jde to nějak rozumně (a pochopitelně) udělat??
> >> 
> >> Je.
> >> 
> >> Mgr Jan Michálek
> >> 
> >> oddělení GIS
> >> 
> >> útvar ISaT
> >> 
> >> ÚHÚL Brandýs nad Labem
> >> 
> >> tel.: +420 322 319 886
> >> 
> >> email: mailto:michalek.jan na uhul.cz
> >> 
> >> url: http://www.uhul.cz/
> >> 
> >> 
> >> 
> >> __________ Informace od ESET NOD32 Antivirus, verze databaze 5300
> >> (20100722) __________
> >> 
> >> Tuto zpravu proveril ESET NOD32 Antivirus.
> >> 
> >> http://www.eset.cz
> >> 
> >> _______________________________________________
> >> Python mailing list
> >> Python na py.cz
> >> http://www.py.cz/mailman/listinfo/python
> >> 
> >> __________ Informace od ESET NOD32 Antivirus, verze databaze 5300
> >> (20100722) __________
> >> 
> >> Tuto zpravu proveril ESET NOD32 Antivirus.
> >> 
> >> http://www.eset.cz
> >> 
> >> 
> >> __________ Informace od ESET NOD32 Antivirus, verze databaze 5300
> >> (20100722) __________
> >> 
> >> Tuto zpravu proveril ESET NOD32 Antivirus.
> >> 
> >> http://www.eset.cz
> >> 
> >> 
> >> __________ Informace od ESET NOD32 Antivirus, verze databaze 5300
> >> (20100722) __________
> >> 
> >> Tuto zpravu proveril ESET NOD32 Antivirus.
> >> 
> >> http://www.eset.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
> 
> 
> __________ Informace od ESET NOD32 Antivirus, verze databaze 5300
> (20100722) __________
> 
> Tuto zpravu proveril ESET NOD32 Antivirus.
> 
> http://www.eset.cz
> 
> 
> 
> __________ Informace od ESET NOD32 Antivirus, verze databaze 5300
> (20100722) __________
> 
> Tuto zpravu proveril ESET NOD32 Antivirus.
> 
> http://www.eset.cz
> 
> _______________________________________________
> Python mailing list
> Python na py.cz
> http://www.py.cz/mailman/listinfo/python


Další informace o konferenci Python