Re: Problem with sub-classing



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__@xxxxxx> 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

.



Relevant Pages

  • Re: Problem with sub-classing
    ... I have this problem when subclassing classes where I get this error: ... instance as first argument (got bbExportGranules instance instead) ... I have class bbExportGranules ... unbound method method() must be called with A instance as first ...
    (comp.lang.python)
  • Problem with sub-classing
    ... I have this problem when subclassing classes where I get this error: ... instance as first argument (got bbExportGranules instance instead) ... I have class bbExportGranules ...
    (comp.lang.python)