Re: Can't use class variable with private nested class

2007-03-28 Thread tron . thomas
On Mar 27, 10:08 pm, [EMAIL PROTECTED] (Alex Martelli) wrote:

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

 Alex

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

-- 
http://mail.python.org/mailman/listinfo/python-list


Can't use class variable with private nested class

2007-03-27 Thread 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?

-- 
http://mail.python.org/mailman/listinfo/python-list


Re: Can't use class variable with private nested class

2007-03-27 Thread Alex Martelli
[EMAIL PROTECTED] wrote:
   ...
 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
-- 
http://mail.python.org/mailman/listinfo/python-list