// A special thank to Olivier Aubert for this code

// run
python late-binding.py
Up
Up
Up
Up
Up
Up
Down
Down
Down
Down
Down
Down
 

//code

class Top:
    pass

class Middle(Top):
    pass

class Bottom(Middle):
    pass

class Up:
    def cv(self, t):
        "Top t"
        print "Up"

    def ctv(self, b):
        "Bottom b"
        print "Up"

class Down(Up):
    def cv(self, m):
        "Middle m"
        print "Down"

    def ctv(self, m):
        "Middle m"
        print "Down"

if __name__ == "__main__":
    u = Up ()
    d = Down ()
    # useless
    # ud = new Down ()
    # first column
    u.cv(Top ())
    u.cv(Middle ())
    u.cv(Bottom ())
    u.ctv(Top ())
    u.ctv(Middle ())
    u.ctv(Bottom ())
    # second column
    d.cv(Top ())
    d.cv(Middle ())
    d.cv(Bottom ())
    d.ctv(Top ())
    d.ctv(Middle ())
    d.ctv(Bottom ())
    # third column
#    ud.cv(Top ())
#    ud.cv(Middle ())
#    ud.cv(Bottom ())
#    ud.ctv(Top ())
#    ud.ctv(Middle ())
#    ud.ctv(Bottom ())