On 9/18/13 7:54 PM, Peter Cacioppi wrote:
This is a very old topic, but here is a trick for single inheritance. (The 
problem you allude to isn't restricted to multiple inheritance).

Any class with a single parent simply defines this function.


     def mySuper(self) :
         return super(self.__class__, self)
And then any parent function be referenced like
     self.mySuper().foo()

You can't use self.__class__ for super, it won't give you the right class if you are using subclasses:

    class MyBase(object):
        def mySuper(self):
            return super(self.__class__, self)

        def say(self):
            print "This is MyBase!"


    class Thing(MyBase):
        def say_it(self):
            print "The parent:"
            self.mySuper().say()

        def say(self):
            print "this is Thing!"

    class SubThing(Thing):
        pass

    thing = Thing()
    thing.say_it()

    sub = SubThing()
    sub.say_it()

This produces:

    The parent:
    This is MyBase!
    The parent:
    this is Thing!

super() takes a class and an instance for a reason. If you could use self.__class__ for the class, then it would only take the instance. Super() needs to know the instance, but also needs to know the class it's being called from.

--Ned.

This includes __init__.

You can read more here.

http://atlee.ca/blog/posts/blog20081121python-reload-danger-here-be-dragons.html


On Thursday, March 21, 2002 2:03:23 PM UTC-7, Marc wrote:
I have classes defined in different files and would like to inherit
from a class in file A.py for a class in file B.py but am running into
problems.  I'm using Python 1.5.2 on Windows NT

Here's a specific example:

************************
file cbase01.py:

class CBase:

     def __init__(self):
         self.cclass = None
         print "cbase"

class CImStream(CBase):

     def __init(self):
         CBase.__init__(self)
         print "CImStream"

*************************
in file wrappers_A01.py:

import cbase01
reload(cbase01)

class ImStream_SavedBitmaps(cbase01.CImStream):

     def __init__(self):
         cbase.CImStream.__init__(self)
         print "SavedBitmaps"

**************************
in file sequencer01.py

import cbase01    # the offending lines, program works
reload(cbase01)   # if I comment these out.

class Sequencer:

     def Append(self, item):
         pass

*****************************
in test02.py

import wrappers_A01
reload(wrappers_A01)

import sequencer01
reload(sequencer01)

x0 = wrappers_A01.ImStream_SavedBitmaps()
***************************************************************

If I run test02 I get the traceback

Traceback (innermost last):
   File "<string>", line 1, in ?
   File "D:\PythonCode\pna\eyeTracking\tests\test02.py", line 15, in ?
     x0 = wrappers_A01.ImStream_SavedBitmaps()
   File "D:\PythonCode\pna\eyeTracking\tests\wrappers_A01.py", line 21,
in __init__
     cbase.CImStream.__init__(self)
TypeError: unbound method must be called with class instance 1st
argument


Any ideas what I am doing wrong?

Thanks,
Marc

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

Reply via email to