nested classes

gbreed at cix.compulink.co.uk gbreed at cix.compulink.co.uk
Tue Jun 19 16:21:32 CEST 2001


In article <3B2E4725.535AB18E at sympatico.ca>, 
seefeld at sympatico.ca (Stefan Seefeld) wrote:

> uh, what do *you* think that I'm trying to do, then ? :)

Beats me :)

> What I'm arguing about is a matter of name resolution. I sure
> can open a scope 'A' in C++, insert a new scope 'B' into it,
> and from within that access other symbols declared in scope 
'A'.
> In fact, I don't need to qualify them (i.e. 'foo' instead of 
'A::foo'
> for any symbol 'foo' in the scope 'A' is just fine) if I'm 
inside
> that scope, no matter how deeply nested (of course, as long as 
there
> are no ambiguities).

You're correct, I've found an example

<http://oopsla.snu.ac.kr/c++/cpplecture/chap5/node22.html>

and an argument against them

<http://www.elj.com/eiffel/ij/nested-classes/>

But my head still spins when I try to think of a C++ class that 
hasn't been instantiated.  C++'s nested classes seem to be a 
special case of what Java's inner classes do, so check the 
thread on those.

Here's another try:

class A:
  def __init__(self):
    self.prefix = 'usr/local'
  class __B:
    def __init__(self, parent):
      self.prefix = os.path.join(parent.prefix, 'share')
  def B(self):
    return self.__B(self)

print A().prefix
print A().B().prefix

You could remember the parent, but that'd lead to a circular 
reference (not such a bad thing for 2.x).

Which means the same purpose would be served by

class FileNode:
  """holds a prefix"""

A = FileNode()
A.prefix = 'usr/local'
A.B = FileNode()
A.B.prefix = os.path.join(A.prefix,'share')

print A.prefix
print A.B.prefix


No problem about the namespace, because it's always explicit.

Or

class FileNode:
  def __init__(self, prefix):
    self.prefix = prefix
  def addNode(self, name, prefix):
    setattr(self, name,
        FileNode(os.path.join(self.prefix, prefix)))

A = FileNode('usr/local')
A.addNode('B','share')

print A.prefix
print A.B.prefix


Or

class FileNode:
  def __init__(self, prefix):
    self.prefix = prefix
  def newChildNode(self, prefix):
    return FileNode(os.path.join(self.prefix, prefix))

A = FileNode('usr/local')
A.B = A.newChildNode('share')

print A.prefix
print A.B.prefix


Perhaps if you give us C++ code of what you're trying to do, we 
can tell you why you don't need to do it ;)


                  Graham



More information about the Python-list mailing list