nested class problem

S

Stephane Ninin

Hello all,

I am trying to play with nested class in a script I am making,
and I am not sure I really understand how they work.


Here is some code:

__all__ = ["ITest"]

from exceptions import Exception

class ITest(object):


def __init__(self):
if (self.__class__ == ITest):
raise Exception("ITest cannot be instanciated")

def read(self,filename):
self.__filename = filename

def _getFilename(self):
return self.__filename

def make_reader():
return _PTest()
make_reader = staticmethod(make_reader)



class _PTest(ITest):

class _PHandler(object):

def __init__(self):
super(_PHandler,self).__init__()
#self.__map={}

def test(self):
pass

def __init__(self):
super(_PTest,self).__init__()


def read(self,filename):
super(_PTest,self).read(filename)
print "HERE"
print dir()
print dir(self)
print self.__class__
print dir(self.__class__)
dh = self._PHandler()
#dh.test()

if __name__=='__main__':

a=ITest.make_reader()
print dir(a)
b=a.read("")
print b




I want to put class _PHandler in _Ptest,
and use _PHandler in _Ptest methods,
but anything I try doesnot work...

On this configuration, I have:
Traceback (most recent call last):
File "./test.py", line 58, in ?
b=a.read("")
File "./test.py", line 51, in read
dh = self._PHandler()
File "./test.py", line 34, in __init__
super(_PHandler,self).__init__()
NameError: global name '_PHandler' is not defined

and I have similar problems if I try to access _PHandler
in different ways...
Is this possible somehow ? Or what is the problem with my approach ?
I know I could just dont use nested classes.., but I'd like to try.

Thanks in advance.

Regards,
 
P

Peter Otten

Stephane said:
I am trying to play with nested class in a script I am making,
and I am not sure I really understand how they work.
[..]

class _PTest(ITest):

class _PHandler(object):

def __init__(self):
super(_PHandler,self).__init__()

Make that
super(_PTest._PHandler, self).__init__()

or, even better, omit it entirely. Python class hierarchies tend to remain
flat, because inheritance is only necessary for code reuse, not to indicate
a particular interface.
#self.__map={}

def test(self):
pass

def __init__(self):
super(_PTest,self).__init__()


def read(self,filename):
super(_PTest,self).read(filename)
print "HERE"
print dir()
print dir(self)
print self.__class__
print dir(self.__class__)
dh = self._PHandler()
#dh.test()

if __name__=='__main__':

a=ITest.make_reader()
print dir(a)
b=a.read("")
print b




I want to put class _PHandler in _Ptest,
and use _PHandler in _Ptest methods,
but anything I try doesnot work...

I think that's you fighting against the language and - a rare case - python
fighting back :)
On this configuration, I have:
Traceback (most recent call last):
File "./test.py", line 58, in ?
b=a.read("")
File "./test.py", line 51, in read
dh = self._PHandler()
File "./test.py", line 34, in __init__
super(_PHandler,self).__init__()
NameError: global name '_PHandler' is not defined

and I have similar problems if I try to access _PHandler
in different ways...
Is this possible somehow ? Or what is the problem with my approach ?
I know I could just dont use nested classes.., but I'd like to try.

I fail to see the benefit of nested classes. If you want to bring some
structure into your python application, try packages instead.

Peter
 

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

Forum statistics

Threads
474,176
Messages
2,570,950
Members
47,500
Latest member
ArianneJsb

Latest Threads

Top