Problem with sub-classing

Bernard Lebel 3dbernard at gmail.com
Mon Jul 17 15:10:07 EDT 2006


Okay, that make sense.

Now the question is: regarding the re-binding behavior, is this
actually problematic? By that I mean that is it good coding practice
to avoid this issue altogether as much as possible, or is it okay to
live with it if you use the __init__ argument trick you have shown?


Thanks
Bernard



On 7/17/06, Peter Otten <__peter__ at web.de> wrote:
> Bernard Lebel wrote:
>
> > Hello,
> >
> > I have this problem when subclassing classes where I get this error:
> >
> > Traceback (most recent call last):
> >
> > File "<Script Block >", line 344, in BBExportElementGranules_Execute
> >     from bb_pipeline import bb_exportelementgranules
> >
> > File
> >
> "\\Linuxserver\ANIMATION\XSI\WORKGROUP_ANIMATION\Data\Scripts\bb_pipeline\bb_exportelementgranules.py",
> > line 101, in ?
> >     oWriter = bbExportGranules()
> >
> > File
> >
> "\\Linuxserver\ANIMATION\XSI\WORKGROUP_ANIMATION\Data\Scripts\bb_pipeline\bb_granules\bb_granuleexport\bb_granuleexport_element.py",
> > line 73, in __init__
> >     bbExportMeta.__init__( self )
> >
> > TypeError: unbound method __init__() must be called with bbExportMeta
> > instance as first argument (got bbExportGranules instance instead)
> >  - [line 343 in
> >
> \\Linuxserver\ANIMATION\XSI\WORKGROUP_ANIMATION\plugins\bb_pipeline\bb_pipeline_py.py]
> >
> >
> > In normal English:
> >
> > I have class bbExportGranules
> > bbExportGranules is a sub-class of 6 other classes
> > In the __init__() of bbExportGranules class, I call the __init__() of
> > 5 of these super-classes.
> >
> >
> > The init of bbExportGranules:
> >
> > class bbExportGranules( bbExportMeta, bbExportClusters,
> > bbExportMaterials, bbExportKinematics, bbExportModels, bbExportMetaToc
> > ):
> >
> > def __init__( self ):
> >
> > bbExportMeta.__init__( self )
> > bbExportClusters.__init__( self )
> > bbExportMaterials.__init__( self )
> > bbExportKinematics.__init__( self )
> > bbExportModels.__init__( self )
> >
> >
> > And the bbExportMeta class (the error is raised when bbExportGranules
> > is subclassing that one):
> >
> > class bbExportMeta:
> >
> > def __init__( self ):
> >
> > self.iPreviousAssetVersion = gec.iNOPREVIOUSASSETVERSION
> > self.iCurrentAssetVersion = gec.iMINCURRENTASSETVERSION
> > self.sPreviousAssetProject = xsi.getdefaultproject()
> >
> >
> >
> >
> > Any suggestion? I really, really don't see what I'm doing wrong here,
> > especially that it actually used to work!
>
> Change bbExportGranules to
>
> class bbExportGranules( bbExportMeta, bbExportClusters,
> bbExportMaterials, bbExportKinematics, bbExportModels, bbExportMetaToc
> ):
>
> def __init__(self,  bbExportMeta=bbExportMeta): # the only change
>
> bbExportMeta.__init__( self )
> bbExportClusters.__init__( self )
> bbExportMaterials.__init__( self )
> bbExportKinematics.__init__( self )
> bbExportModels.__init__( self )
>
> If it then starts to work again you are probably rebinding bbExportMeta
> later in your script, e. g:
>
> >>> class A:
> ...     def method(self): pass
> ...
> >>> class B(A):
> ...     def method(self):
> ...             A.method(self)
> ...
> >>> b = B()
> >>> b.method() # no error
> >>> class A: # rebinding A
> ...     def method(self): pass
> ...
> >>> b.method() # oops
> Traceback (most recent call last):
>   File "<stdin>", line 1, in ?
>   File "<stdin>", line 3, in method
> TypeError: unbound method method() must be called with A instance as first
> argument (got B instance instead)
>
> One way to make that happen is to import the same file twice, once as part
> of a package and once directly. Solution: never set a path into a
> package...
>
> Peter
>
> --
> http://mail.python.org/mailman/listinfo/python-list
>



More information about the Python-list mailing list