I'm collecting instances using the following code:
class Hand():
instances = []
def __init__(self):
Hand.instances.append(self)
self.value = 5
def do_something(self, a):
self.value = self.value * a
class Foo():
def __init__(self):
pass
def insty(self):
self.hand1 = Hand()
self.hand2 = Hand()
foo = Foo()
foo.insty()
print Hand.instances
for hand in Hand.instances:
print "how do I print the instance name?"
The last line is just a way to learn how to to access the instance name so i can call the 'do_something' method on each instance in order.
How do I access the instance name for each instance of Hand?
foo.__dict__
will have "hand1
" and "hand2
" keys (among others). But you're probably going about this the wrong way. If the names are significant, you should use them as explicit indices inFoo
(or somewhere).e.g.
I don't know if this would solve your problem or not. I needed to get instance names in order to do clear error reporting. Everywhere I looked, folks said "variables don't have names! The name is just a pointer to the thing!"
But it turns out that getting instance names in python is pretty straightforward. Here's how I did it:
If you mean how to get
hand1
from the instance you assigned toself.hand1
, the answer is that you can't. When you doself.hand1 = Hand()
, you tell the Foo object it has a Hand, but the Hand object has no knowledge that it has been assigned to a Foo. You could do this:Now what is the "name" of that Hand supposed to be? You assigned the same hand to both "bob" and "larry", so there's no way it can have a single unique name.
If you want to have a name for each hand, you need to tell the hand what name you want to give it. You would have to modify your Hand code to allow you to pass a name to the constructor, then create the Hand with
Hand("some name")
.You can of course give the hands "names" by assigning attributes on them:
. . . but these names are not special or "automatic" in any way.
The bottom line is that if you want something to have a name, you need to decide how to handle that name. You need write your own code that gives it its name, and your own code that retrieves its name.
foo = Foo()
means that the variablefoo
just points to the object returned byFoo()
, there's no concept of name here.