Delete a instance passed by reference into a method
hdante
hdante at gmail.com
Mon Dec 3 21:27:02 EST 2007
On Dec 3, 10:02 pm, "Gabriel Genellina" <gagsl-... at yahoo.com.ar>
wrote:
> En Mon, 03 Dec 2007 19:53:20 -0300, sccs cscs <zorg... at yahoo.fr> escribió:
>
> > I am very surprising by the Python interpreter behavior : see code
> > I initialize a 'A' and a 'B', and i give a B instance reference to the
> > instance A in 'm1' method. I can modify (IN/OUT mode) the 'i'
> > attribute ( aB.i = 10 ) , BUT I CANNOT DELETE "aB" into the fonction
> > m1 ! the code " del aB " or " aB= None" has no effect. 'aB' still
> > exists when m1() is finsihed! WHY ? How can i do that?
>
> First, read this <http://effbot.org/zone/python-objects.htm>
>
>
>
> > class A(object):
> > def __init__(self):
> > pass
> > def m1 (self, aB ):
> > aB.i = 10
> > del aB
> > print "no more B"
> > class B(object):
> > def __init__(self,i):
> > self.i = i
> > def __del__(self):
> > print "delete B"
>
> > aA = A ()
> > aB = B ( i = 6)
>
> > unA.m1 (aB )
> > print str( aB .i ) #---> Display 10, aB is not destroy !
>
> The "del" statement does NOT delete the object, it only removes the name
> from the current namespace (and doing so, it decrements the object's
> reference count by one). If that was the last reference to the object, it
> becomes a candidate for being garbage collected later.
>
> __del__ is not used too much. If you want to ensure resource deallocation,
> use either a try/finally block or a with statement:
>
> f = open('filename'):
> try
> for line in f:
> do_something_with(line)
> finally
> f.close()
>
> Another alternative, Python 2.5 and up:
>
> from __future__ import with_statement
>
> with open('filename') as f:
> for line in f:
> do_something_with(line)
> # there is an implicit f.close() here
>
> If you want to use __del__ for another purpose, please describe your use
> case (what you want to achieve, not how you think you should implement it).
>
> --
> Gabriel Genellina
(note, you don't want to do this, it's a proof of concept)
import sys
class A(object):
def __init__(self):
pass
def m1(self, x = None):
if x == None:
x = sys._getframe(1).f_locals
ab = 'aB'
x[ab].i = 10
del x[ab]
print 'No more B'
class B(object):
def __init__(self, i):
self.i = i
def __del__(self):
print 'delete B'
aA = A()
aB = B(i = 6)
print str(aB.i)
aA.m1()
print str(aB.i)
Outputs:
In python:
6
delete B
No more B
Traceback (most recent call last):
File "del.py", line 23, in <module>
print str(aB.i)
NameError: name 'aB' is not defined
In jython:
6
No more B
Traceback (innermost last):
File "del.py", line 23, in ?
NameError: aB
More information about the Python-list
mailing list