[Tutor] introspection

Ben Finney ben+python at benfinney.id.au
Wed Apr 22 01:38:18 CEST 2015


Alex Kleider <akleider at sonic.net> writes:

> I was hoping that it would be possible to create a function
> that would do the following:
>
> def my_name(some_object):
>   return some_object.__name__

That hope is understandable.

It is also easy to be confused about why such a feature doesn't exist;
after all, it works for functions and classes and modules (oh my!)::

    >>> def foo(): pass
    ... 
    >>> foo.__name__
    'foo'
    >>> class Bar: pass
    ... 
    >>> Bar.__name__
    'Bar'
    >>> import sys
    >>> sys.__name__
    'sys'

So why not arbitrary objects?

    >>> spam = 4
    >>> spam.__name__
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    AttributeError: 'int' object has no attribute '__name__'

The answer is that functions, classes, and modules are all *defined*,
and (normally) have exactly one canonical name established at definition
time.

Arbitrary objects are merely *instantiated*, without that definition
step. Quite commonly they are used with no name bound to them; so the
behaviour of most objects does not have ‘__name__’ in the API.

If you would like to make a class that has that attribute on all its
instances, feel free. But you need to figure out how the instance
detects its own name!

    class LockeanThing:
        """ An object that knows the name by which others refer to it. """

        def __init__(self):
            self.__name__ = ???

> But I see what I think you and others have been trying to explain to
> me: that the expression some_object.__name__, if it existed, would
> indeed be schizophrenic since it would be an attribute of the object,
> not the name(s) to which it is bound.

That's why I prefer to be clear that the binding operation is one-way
only.

A reference (such as a name) is bound to an object, the object is not
bound to the reference — indeed, the object knows nothing about that
relationship.

-- 
 \        “I washed a sock. Then I put it in the dryer. When I took it |
  `\                                 out, it was gone.” —Steven Wright |
_o__)                                                                  |
Ben Finney



More information about the Tutor mailing list