using names before they're defined

Bruno Desthuilliers onurb at xiludom.gro
Fri Jul 21 14:20:00 EDT 2006


davehowey at f2s.com wrote:
> Hi
> 
> 
(snip)
> 
>>>>def get_class_by_name(name):
>>>> return globals()[name]
>>>
>>Q&D way to retrieve the class object (Python's classes are themselves
>>objects) known by it's name (as a string).
> 
> 
> ok, so it actually returns the class object itself.
> One thing that confuses me is that objects have a name (self.name)

They dont - unless you give them one:

>>> class Foo(object): pass
...
>>> Foo.name
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: type object 'Foo' has no attribute 'name'
>>> f = Foo()
>>> f.name
Traceback (most recent call last):
  File "<stdin>", line 1, in ?
AttributeError: 'Foo' object has no attribute 'name'
>>>

classes, functions and modules have a __name__ attribute, but that's
something else...

> but
> object instances also have a name (e.g. myspecialturbine = turbine(...)

Actually, this is the other way round: names refers ('are bound to')
objects. Think of namespaces (the global or local one...) as dicts
holding name:ref-to-object pairs (that's mostly what they are FWIW).
Different names can refer to the same object. The object itself doesn't
know anything about this.

> ---- how do I discover the name 'myspecialturbine' ?). 

>From within the object refered by this name ? Short answer : you can't.

> And object
> instances have a class name too ('turbine'). 

Nope, they have a class, which itself as a __name__ attribute, which is
the name that was used when "creating" the class object (ie: usually
when the 'class' statement is eval'd at module load time).

> Aaargh, too many names!
> what if just want to know what the name of the instance is (in this
> case 'myspecialturbine'?)

you just named it so yourself, ie:
  myspecialturbine = SpecialTurbine()

Else, no way. You can of course give a name when instanciating the object:

class Named(object):
  def __init__(self, name):
    self.name = name

n1 = Named('n1')
print n1.name
=> n1

But this doesn't mean there's any correspondance between this name and a
name in the current (or any other) namespace:

toto = n1
n1 = "lalala"
print toto.name
=> n1

locals()[toto.name] is toto
=> False


-- 
bruno desthuilliers
python -c "print '@'.join(['.'.join([w[::-1] for w in p.split('.')]) for
p in 'onurb at xiludom.gro'.split('@')])"



More information about the Python-list mailing list