Sei que essa é uma questão antiga, mas é importante notar que mesmo em python 3 essas duas coisas não são exatamente a mesma coisa.
Se você herda explicitamente de object
, o que você está realmente fazendo é herdar de, builtins.object
independentemente do que isso aponte no momento.
Portanto, eu poderia ter algum módulo (muito estranho) que substitui o objeto por algum motivo. Chamaremos este primeiro módulo de "newobj.py":
import builtins
old_object = builtins.object # otherwise cyclic dependencies
class new_object(old_object):
def __init__(self, *args, **kwargs):
super(new_object, self).__init__(*args, **kwargs)
self.greeting = "Hello World!"
builtins.object = new_object #overrides the default object
Depois, em algum outro arquivo ("klasses.py"):
class Greeter(object):
pass
class NonGreeter:
pass
Em seguida, em um terceiro arquivo (que podemos realmente executar):
import newobj, klasses # This order matters!
greeter = klasses.Greeter()
print(greeter.greeting) # prints the greeting in the new __init__
non_greeter = klasses.NonGreeter()
print(non_greeter.greeting) # throws an attribute error
Portanto, você pode ver que, no caso em que está explicitamente herdando do objeto, obtemos um comportamento diferente daquele onde você permite a herança implícita.