[python] Třída, která vytvoří instanci jen pokud tam už není instance se stejnými parametry

Tomáš Drenčák tomas na drencak.com
Čtvrtek Červenec 22 15:12:36 CEST 2010


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
>


Další informace o konferenci Python