[python] =?iso-8859-2?q?T=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 16:21:26 CEST 2010


Protoze je to old-style trida. ty zadny __new__ nemaji. Ani sloty, 
deskriptory, nic. 

MICHÁLEK Jan Mgr. (čtvrtek 22 Červenec 2010 16:13:27):
> No, mě není jasný potom, proč, když dám
> 
> >>> class c1:
> 	def __new__(cls):
> 		print 'new'
> 	def __init__(self):
> 		print 'init'
> 
> >>> c=c1()
> 
> init
> 
> 
> Proč se pustí jen init a ne new??
> 
> Dík
> 
> -----Original Message-----
> From: python-bounces na py.cz [mailto:python-bounces na py.cz] On Behalf Of Hynek
> Fabian Sent: Thursday, July 22, 2010 3:55 PM
> To: Konference PyCZ
> Subject: Re: [python] =?iso-8859-2?q?=5Bpython=5D=09T=F8=EDda?=, která
> vytvoří instanci jen pokud tam už není instance se stejnými parametry
> 
> 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
> 
> _______________________________________________
> 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