New submission from Thomas Chiroux:

when using multi-inheritance and super() in __init__(), super() tries to run 
each constructor once.
For this to work correctly, it is needed to call super() in each constructor, 
including for Classes directly inherited from object.

The sample below does not execute correctly because threading.Thread 
constructor does not call super()
(and because Thread inherit from _Verbose, _Verbose should also call super() )

from threading import Thread

class Foo(object):
    def __init__(self):
        super(Foo, self).__init__()
        print('Foo constructor')
        self.param1 = 'foo param1'

class Bar(Thread, Foo):
    def __init__(self):
        super(Bar, self).__init__()
        print('Bar constructor')
        self.another_param1 = "bar another_param1"

    def run(self):
        print("Running (%s - %s)" % (self.another_param1, self.param1))

if __name__ == '__main__':
    threads = []
    for i in range(1, 10):
        thread = Bar()

    for thread in threads:

This sample work by simply inverting Thread and Foo :

class Bar(Foo, Thread):

The sample is about threading.Thread, but it's also the same for 
multiprocessing.Process, and maybe for other modules in stdlib.

attached is a proposed path for threading.Tread in 2.7

I've tested the issue and have the same behavior in 2.7 and in 3.3

components: Library (Lib)
files: diff_threading.py_2.7.patch
keywords: patch
messages: 176576
nosy: thomas.chiroux
priority: normal
severity: normal
status: open
title: Bad multi-inheritance support in some libs like threading or 
type: behavior
versions: Python 2.7, Python 3.3
Added file:

Python tracker <>
Python-bugs-list mailing list

Reply via email to