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

MICHÁLEK Jan Mgr. Michalek.Jan na uhul.cz
Čtvrtek Červenec 22 16:13:27 CEST 2010


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
 


Další informace o konferenci Python