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: [email protected] [mailto:[email protected]] 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: [email protected] [mailto:[email protected]] 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 <[email protected]>: > > > 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. <[email protected]>: > > >> 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: [email protected] [mailto:[email protected]] 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: [email protected] > > >> Jabber: [email protected] > > >> > > >> 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:[email protected] > > >> > > >> 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 > > >> [email protected] > > >> 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 > > >> [email protected] > > >> http://www.py.cz/mailman/listinfo/python > > > > _______________________________________________ > > Python mailing list > > [email protected] > > 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 > > [email protected] > > http://www.py.cz/mailman/listinfo/python > > _______________________________________________ > Python mailing list > [email protected] > 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 > [email protected] > http://www.py.cz/mailman/listinfo/python _______________________________________________ Python mailing list [email protected] http://www.py.cz/mailman/listinfo/python
