Maybe I’m wrong, but Python’s OO seems to be broken…

Note: I have since figured out inheritance in Python, so this is all just a rant that is no longer relevant, really.

So, I’ve been trying to figure out inheritance in Python. In Lisp (and even C++ and Java), derived objects will have the cons of their parent called. For example, look at the following C++ snippet:

#include <iostream>

using namespace std;

class B {
public:
	B() {
		cout << __PRETTY_FUNCTION__ << endl;
	}
};

class A : public B {
public:
	A() {
		cout << __PRETTY_FUNCTION__ << endl;
	}
};

int
main(int argc, const char **argv)
{
	A *foo = new A();
	delete foo;
	return 0;
}

This outputs the following:

B::B()
A::A()

As you can tell, the parent object’s constructor is called and then your derived object’s constructor is called. But, in this Python code, the parent object’s constructor is not:

class B:
    def __init__(self):
        print "B.__init__(self)"

class A(B):
    def __init__(self):
        print "A.__init__(self)"

A()

This outputs:

A.__init__(self)

Instead you have to do:

class B:
    def __init__(self):
        print "B.__init__(self)"

class A(B):
    def __init__(self):
	B.__init__(self)
        print "A.__init__(self)"

A()

To get the right output:

B.__init__(self)
A.__init__(self)

This seems broken to me. But maybe I’m not understanding something. The way I got bit by this was by trying to design a new replacement to debian/rules which used subclassing. (More on this later.)

Oh, and I intend to try to keep my blog updated more often.