Can't use class variable with private nested class

T

tron.thomas

The following code will print a message only once:
class PrintOnce:
printOnce = True

def __init__(self):
if PrintOnce.printOnce:
print 'Printing once.'
PrintOnce.printOnce = False

first = PrintOnce()
second = PrintOnce()

The following code will do the same thing for a nested class:
class Outer:
class Inner:
printOnce = True

def __init__(self):
if Outer.Inner.printOnce:
print 'Printing once.'
Outer.Inner.printOnce = False

def __init__(self):
first = Outer.Inner()
second = Outer.Inner()

outer = Outer()


However the following code, which has a private nested class, does not
work:
class Public:
class __Private:
printOnce = True

def __init__(self):
print 'Creating a __Private instance'
if Public.__Private.printOnce:
print 'Printing once.'
Public.__Private.printOnce = False

def __init__(self):
print 'Creating a Public instance'
first = Public.__Private()
second = Public.__Private()

public = Public()

Attempting to run the code will produce this error:
AttributeError: class Public has no attribute '_Private__Private'

What can be done so that this private nested class can have the same
functionality as the public nested class?
 
A

Alex Martelli

class Outer:
class Inner:
printOnce = True

def __init__(self):
if Outer.Inner.printOnce:
print 'Printing once.'
Outer.Inner.printOnce = False

def __init__(self):
first = Outer.Inner()
second = Outer.Inner()

outer = Outer()


However the following code, which has a private nested class, does not
work:
class Public:
class __Private:
printOnce = True

def __init__(self):
print 'Creating a __Private instance'
if Public.__Private.printOnce:

When, anywhere "immediately inside" a class named X, you use a name
__foo starting with two underscores, that name is mangled to _X__foo.
Here, you're inside class __Private, so the mangling of __Private is to
_Private__Private (I'd actually have expected more stray underscores
hither and thither, but that's the gist of it).
print 'Printing once.'
Public.__Private.printOnce = False

def __init__(self):
print 'Creating a Public instance'
first = Public.__Private()
second = Public.__Private()

public = Public()

Attempting to run the code will produce this error:
AttributeError: class Public has no attribute '_Private__Private'

What can be done so that this private nested class can have the same
functionality as the public nested class?

Forget all the naming silliness and use self.__class__.printOnce
instead.


Alex
 
T

tron.thomas

Forget all the naming silliness and use self.__class__.printOnce
instead.

Alex

I tried self.__class__.printOnce and that worked. Thanks for your
help.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

No members online now.

Forum statistics

Threads
473,743
Messages
2,569,478
Members
44,899
Latest member
RodneyMcAu

Latest Threads

Top