Zdaję sobie sprawę, że to stare pytanie, ale warto zauważyć, że nawet w Pythonie 3 te dwie rzeczy nie są tym samym.
Jeśli wyraźnie dziedziczysz po object, to, co faktycznie robisz, jest dziedziczeniem builtins.object niezależnie od tego, na co to wskazuje w danym momencie.
Dlatego mógłbym mieć jakiś (bardzo zwariowany) moduł, który z jakiegoś powodu nadpisuje obiekt. Nazwijmy ten pierwszy moduł „newobj.py”:
import builtins
old_object = builtins.object
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
Następnie w innym pliku („klasses.py”):
class Greeter(object):
pass
class NonGreeter:
pass
Następnie w trzecim pliku (który faktycznie możemy uruchomić):
import newobj, klasses
greeter = klasses.Greeter()
print(greeter.greeting)
non_greeter = klasses.NonGreeter()
print(non_greeter.greeting)
Możesz więc zobaczyć, że w przypadku, gdy dziedziczenie jest jawne po obiekcie, uzyskujemy inne zachowanie niż wtedy, gdy zezwalasz na niejawne dziedziczenie.