Nested inner classes and inheritance -> namespace problem

Jean-Michel Pichavant jeanmichel at sequans.com
Wed Apr 13 06:08:21 EDT 2011


Larry Hastings wrote:
>
> The problem: if you're currently in a nested class, you can't look up 
> variables in the outer "class scope".
>
> For example, this code fails in Python 3:
>
>     class Outer:
>       class Inner:
>         class Worker:
>           pass
>
>       class InnerSubclass(Inner):
>         class Worker(Inner.Worker):
>           pass
>
> It fails at the definition of Worker inside InnerSubclass.  Python 3 
> can't find "Inner", in order to get to "Inner.Worker".
>
> Adding "global Inner" just above that line doesn't help--it's not a 
> global.
> Adding "nonlocal Inner" just above that line doesn't help either--I 
> suppose it's the /wrong kind/ of nonlocal.  nonlocal is for nested 
> functions, and this uses nested classes.
>
> You can tell me YAGNI, but I tripped over this because I wanted it.  
> It's not a contrived example.  I actually use inner classes a lot; I 
> suppose I'm relatively alone in doing so.
>
> Yes, I could make the problem go away if I didn't have nested inner 
> classes like this.  But I like this structure.  Any idea how I can 
> make it work while preserving the nesting and inheritance?
>
> Thanks,
>
>
> /larry/
class Outer:
  class Inner:
    class Worker:
      pass

  print 'Outer ', locals()
  class InnerSubclass(Inner):
    print 'InnerSubclass', locals()
    class Worker:
      pass

Outer  {'__module__': '__main__', 'Inner': <class __main__.Inner at 
0x963a7ac>}
InnerSubclass {'__module__': '__main__'}

I use myself nested classes a lot, but only as namespace / enum, meaning 
there is no inheritance involved. I don't think that you can do what you 
are trying to do.
Outer would actually be a module, not a class.

JM



More information about the Python-list mailing list