imported modules becomes None when replacing current module in sys.modules using a class object
Question: an unpopular but "supported" python hack (see Guido:
<https://mail.python.org/pipermail/python-ideas/2012-May/014969.html>) that
enables `__getattr__` usage on module attributes involves the following:

    
    
    import os, sys
    
    class MyClass(object):
    
        def check_os(self):
            print os
    
    sys.modules[__name__] = MyClass()
    

On import, this the imported module becomes a class instance:

    
    
    >>> import myModule
    >>> myModule
    <myModule.MyClass object at 0xf76def2c>
    

However, in Python-2.7, all other imported modules within the original module
is set to None.

    
    
    >>> repro.check_os()
    None
    

In Python-3.4, everything works:

    
    
    >>> repro.check_os()
    <module 'os' from '/python/3.4.1/lib/python3.4/os.py'>
    

This feels like something to do with [Imported modules become None when
running a function](http://stackoverflow.com/questions/17084260/imported-
modules-become-none-when-running-a-function), but, anyone knows why this
happens internally?

It seems that if you store the original module (without fully replacing it in
Python-2) then everything continues to work:

    
    
    sys.modules[__name__+'_bak'] = sys.modules[__name__]      
    


Answer: The problem you are running in to is that in Pythons prior to 3.4 when a
module is destroyed (as yours is because you replace it with a class and there
are no further references to it), the items in that module's `__dict__` are
forcibly set to `None`.

The workaround, if you need to support Pythons prior to 3.4, is have an
`import` statement in the class that will replace the module:

    
    
    class MyClass(object):
    
        import os
    
        def check_os(self):
            print(os)
    

For more info, see [this answer about interpreter
shutdown](http://stackoverflow.com/a/25649713/208880).

