How to control the creation of an instance?

7stud bbxx789_05ss at yahoo.com
Sun Jun 3 02:25:49 EDT 2007


On Jun 3, 12:17 am, 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

Oops.  This line:

> temp = object.__new__(Sample, args, kwds)

should be:

temp = object.__new__(cls, args, kwds)

although it would seem that cls is always going to be Sample, so I'm
not sure what practical difference that makes.




More information about the Python-list mailing list