How to control the creation of an instance?

L

lialie

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
 
7

7stud

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 <....>
 
7

7stud

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>]
 
7

7stud

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
 
7

7stud

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.
 
S

Steven D'Aprano

Oops. This line:


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?
 
K

KingMax

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__.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,280
Latest member
BGBBrock56

Latest Threads

Top