Access descendant class's module namespace from superclass

George Sakkis gsakkis at rutgers.edu
Mon Jul 11 20:17:01 EDT 2005


"Reid Priedhorsky" <reid at reidster.net> wrote:

> Dear group,
>
> I'd have a class defined in one module, which descends from another class
> defined in a different module. I'd like the superclass to be able to
> access objects defined in the first module (given an instance of the first
> class) without importing it. Example of what I'm looking for:
>
> <<<file spam.py>>>
>
>    class Spam(object):
>       def fish(self):
>          a = self.__module__.Ham()
>
> <<<file eggs.py>>>
>
>    import spam
>
>    class Eggs(spam.Spam):
>       pass
>
>    class Ham(object):
>       pass
>
> The above doesn't work because __module__ is a string, not a module object:
>
>    >>> import eggs
>    >>> b = eggs.Eggs()
>    >>> b.fish()
>    Traceback (most recent call last):
>      File "<stdin>", line 1, in ?
>      File "spam.py", line 3, in foo
>        a = self.__module__.Ham()
>    AttributeError: 'str' object has no attribute 'Ham'
>
> (I suppose I could call __import__(self.__module__), but that seems kind
> of awkward.)
>
> Is this possible using Python 2.3? Any better ways to accomplish this?

I don't know if it's "better", but since you know that self.__module__
has already been imported, you can access it through the sys.modules
dict:
    a = sys.modules[self.__module__].Ham()

By the way, this seems like an error-prone hack. Are you sure you want
to relate two independent classes just by the fact that they rely in
the same file ? Remember, explicit is better than implicit.

George




More information about the Python-list mailing list