Inheritance and forward references (prototypes)

Lorenzo Di Gregorio lorenzo.digregorio at gmail.com
Sat Jun 20 16:26:56 EDT 2009


On Jun 20, 8:43 pm, Dave Angel <da... at ieee.org> wrote:
> Lorenzo Di Gregorio wrote:
> > Hi,
>
> > I'm wondering what would be the preferred way to solve the following
> > forward reference problem:
>
> > ---------------------------------------
> > class BaseA(object):
> >     def __init__(self):
> >         return
>
> > class DebugA(BaseA):
> >     def __init__(self):
> >         return
>
> > # here I would have a prototype of class A which is the same as class
> > BaseA
>
> > class B(object):
> >     def __init__(self):
> >         self.obj = A()
> >         return
>
> > if __name__ == "__main__":
> > #    class A(BaseA): # Uncomment this for using BaseA objects
> > #       pass
> >     class A(DebugA): # Uncomment this for using DebugA objects
> >         pass
> > ---------------------------------------
>
> > I can figure out some ways to fix this but none seems satisfying.
> > Either they are too specific or too cumbersome.
> > A runtime redefinition of class A does not seem to work either.
> > What would be the most "pythonesque" solution other than sorting out
> > the class order?
>
> > Best Regards,
> > Lorenzo
>
> You haven't shown us any problem.  class B works fine with a forward
> reference to A.  Now if you were trying to subclass A before defining
> it, that'd be a problem.  Or if you were trying to make an instance of B
> before defining A.
>
> Better put some code together with enough meat to actually show a
> symptom.  And tell us what sys.version says.  I'm testing with   2.6.2
> (r262:71605, Apr 14 2009, 22:40:02) [MSC v.1500 32 bit (Intel)], running
> on Win XP.- Hide quoted text -
>
> - Show quoted text -

Thank you for your help: I'm working on a rather large source, but I
think I have isolated the problem now.
This listing generates an error:

-----------------------------------------------
class BaseA(object):
    def __init__(self):
        return

class DebugA(BaseA):
    def __init__(self):
        return

class B(object):
    def __init__(self,test=A()):
        self.obj = A()
        return

if __name__ == "__main__":
#    class A(BaseA): # Uncomment this for using BaseA objects
#        pass
     class A(DebugA): # Uncomment this for using DebugA objects
         pass
-----------------------------------------------

The error happens because Python apparently evaluates the named
arguments before running the script.
I think I have read something about this some (long) time ago but I
can't find it anymore.

Suggestions?

BTW, my Python version is 2.6.1 (with latest PyDev).

Thx!
Lorenzo



More information about the Python-list mailing list