By using this site, you agree to our updated Privacy Policy and our Terms of Use. Manage your Cookies Settings.
444,001 Members | 1,262 Online
Bytes IT Community
+ Ask a Question
Need help? Post your question and get tips & solutions from a community of 444,001 IT Pros & Developers. It's quick & easy.

How to control the creation of an instance?

P: n/a
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

Jun 3 '07 #1
Share this Question
Share on Google+
7 Replies


P: n/a
On Jun 2, 10:31 pm, lialie <lia...@gmail.comwrote:
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
Try something like this:

class A(object):
pass

def getObj(alist):
if alist:
return alist.pop()
else:
return A()

x = [A(), A()]
print x

newlist = []
for i in range(0,3):
newlist.append(getObj(x) )

print newlist

--output:--
[<__main__.A object at 0x55bf0>, <__main__.A object at 0x55b50>]
[<__main__.A object at 0x55b50>, <__main__.A object at 0x55bf0>,
<__main__.A object at 0x55d30>]
Examine the addresses, i.e. the set of numbers in each <....>

Jun 3 '07 #2

P: n/a
I just noticed that in your code you used pop(0). It's not efficient
to pop an element off the front of a list because after doing so,
every other element in the list has to be moved over to the left one
position. If you pop() an element off the end of the list, then the
first element in the list remains the first element, and the 2nd
element remains the 2nd element, etc., so no shifting of the remaining
elements is required. If you need to pop elements of the front of a
list, then it's more efficient to use a deque, which can be found in
the collections module. Here is an example:

import collections

class A(object):
pass

def getObj(a_deque):
if a_deque:
return a_deque.popleft()
else:
return A()

x = collections.deque([A(), A()])
print x

newlist = []
for i in range(0,3):
newlist.append(getObj(x) )

print newlist

--output:--
deque([<__main__.A object at 0x55d90>, <__main__.A object at
0x55db0>])
[<__main__.A object at 0x55d90>, <__main__.A object at 0x55db0>,
<__main__.A object at 0x55e30>]

Jun 3 '07 #3

P: n/a
On Jun 2, 10:31 pm, lialie <lia...@gmail.comwrote:
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

Jun 3 '07 #4

P: n/a
On Jun 3, 12:17 am, 7stud <bbxx789_0...@yahoo.comwrote:
On Jun 2, 10:31 pm, lialie <lia...@gmail.comwrote:
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.

Jun 3 '07 #5

P: n/a
On Sat, 02 Jun 2007 23:25:49 -0700, 7stud wrote:
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.
What if you are calling it from a sub-class?
--
Steven.

Jun 3 '07 #6

P: n/a
On Jun 3, 12:50 am, Steven D'Aprano
<s...@REMOVE.THIS.cybersource.com.auwrote:
On Sat, 02 Jun 2007 23:25:49 -0700, 7stud wrote:
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.

What if you are calling it from a sub-class?

--
Steven.
cls it is!

Jun 3 '07 #7

P: n/a
On Jun 3, 2:17 pm, 7stud <bbxx789_0...@yahoo.comwrote:
On Jun 2, 10:31 pm, lialie <lia...@gmail.comwrote:
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__.

Jun 3 '07 #8

This discussion thread is closed

Replies have been disabled for this discussion.