Assigning to self
Reinhold Birkenfeld
reinhold-birkenfeld-nospam at wolke7.net
Mon Jan 17 14:03:16 EST 2005
Frans Englich wrote:
> Hello,
>
> I am having trouble with throwing class instances around. Perhaps I'm
> approaching my goals with the wrong solution, but here's nevertheless a
> stripped down example which demonstrates my scenario:
>
> #------------------------------------------------------------------------------------------
>
> class foo:
> tests = {}
> def __init__( self, id ):
>
> try:
> me = self.__class__.tests[ id ]
>
> except KeyError:
> print "Did not exist, initializing myself.."
> self.attr = "exists"
> self.__class__.tests[ id ] = self
>
> else:
> print "Already exists! Re-using existing instance"
> self = me
>
> print "Me", self.attr + "!" # line 18
>
> def yo(self):
> return self.attr # line 21
As 'self' is a method parameter, changing it only affects the current
function. When __init__ is called, the instance is already created, so
you can't change it.
What you are looking for is a class factory (is this term correct?),
here is a sample implementation (using 2.4 decorators):
class foo:
tests = {}
@classmethod
def get_test(cls, id):
if cls.tests.has_key(id):
return cls.tests[id]
else:
inst = cls()
inst.attr = "exists"
cls.tests[id] = inst
return inst
def yo(self):
return self.attr
Here you define get_test as a classmethod, that is, it does not receive
the instance as first argument, but the class. It can be called from the
class (foo.get_test) or an instance (foo().get_test).
An alternative might be to override __new__, but I'm sure someone other
will suggest this.
Reinhold
More information about the Python-list
mailing list