How to control the creation of an instance?

KingMax lialie at gmail.com
Sun Jun 3 13:31:07 CEST 2007


On Jun 3, 2:17 pm, 7stud <bbxx789_0... at yahoo.com> wrote:
> On Jun 2, 10:31 pm, lialie <lia... at gmail.com> wrote:
>
>
>
> > Hi,
>
> > suppose i have a free_object list[Sample1, Smaple2....]. when create a
> > new object sample(*args, **kwds), if free_object_list isn't empty, just
> > pop one from free_object_list instead of creating a new instance.
>
> > any way to do this?
>
> > I do some work as follows:
>
> > class Sample(object):
> > used_object = []
> > free_object = []
>
> > def __init__(self, *args, **kwds):
> > pass
>
> > def __new__(self, *args, **kwds):
> > if Sample.free_object:
> > obj = Sample.free_object.pop(0)
> > else:
> > obj = object.__new__(Sample, *args, **kwds)
> > Sample.used_object.append(obj)
> > return obj
>
> > ######## still get a new instance :(
>
> > def Release(self):
> > Sample.used_object.remove(self)
> > Sample.free_object.append(self)
> > return True
>
> This seems to work for me:
>
> import collections
>
> class Sample(object):
>
>     free_objects = collections.deque()
>     used_objects = []
>
>     def __new__(cls, *args, **kwds):
>         if not Sample.free_objects:
>             temp = object.__new__(Sample, args, kwds)
>             Sample.used_objects.append(temp)
>             return temp
>         else:
>             return Sample.free_objects.popleft()
>
>     def __init__(self, *args, **kwds):
>         self.args = args
>         self.kwds = kwds
>
>     def release(self):
>         Sample.used_objects.remove(self)
>         Sample.free_objects.append(self)
>
> s1 = Sample(10, name="Bob")
> print s1
> print s1.args
> print s1.kwds
>
> s2 = Sample("red", name="Bill")
> print s2
> print s2.args
> print s2.kwds
>
> s1.release()
> s3 = Sample("blue", name="Tim")
> print s3
> print s3.args
> print s3.kwds

Thank you.
>     def __new__(cls, *args, **kwds):
>         if not Sample.free_objects:
>             temp = object.__new__(Sample, args, kwds)
>             Sample.used_objects.append(temp)
>             return temp
>         else:
>             return Sample.free_objects.popleft() # Here you may lost one object :)

The free_objects list doesn't have orders. My sample code seems to
work. But follows may create a new instance:

class Sample(wx.Image):
    free_objects = []
    used_objects
    def __int__(self, *args, **kwds):
        wx.Image.__init__(self, *args, **kwds) #### play tricks with
me :)
        pass

    def __new__(cls, *args, **kwds):
        # The same

wx.Image always create a new instance. It seems that I have to avoid
wx.Image.__init__.




More information about the Python-list mailing list