Ist es notwendig oder nützlich, in Python 3.x von Pythons Objekt zu erben?

91

In einer älteren Python-Version kann eine Klasse, wenn Sie sie in Python erstellen, von einem Objekt erben. Soweit ich weiß, handelt es sich um ein spezielles integriertes Python-Element, mit dem Ihr Objekt ein Objekt neuen Stils sein kann.

Was ist mit neueren Versionen (> 3.0 und 2.6)? Ich habe über das Klassenobjekt gegoogelt, aber ich bekomme so viele Ergebnisse (aus offensichtlichen Gründen). Irgendein Hinweis?

Danken!

Thomas
quelle
2
Wenn Ihr Code auch unter 2.x verwendet wird, ist es gut, explizit zu sein.
smci
1
Es ist gut beantwortet in dieser Frage: stackoverflow.com/questions/4015417/…
nngeek

Antworten:

88

Sie müssen nicht erben object, um in Python 3 einen neuen Stil zu haben. Alle Klassen haben einen neuen Stil.

SilentGhost
quelle
4
Beachten Sie, dass dies bedeutet, dass alle Klassen objectunabhängig davon erben, ob sie (object)in Python 3.1
u0b34a0f6ae
8
Sie müssen nicht, aber der "Portieren von Python-Code nach Python 3" besagt, dass er noch gültig ist: docs.python.org/py3k/howto/pyporting.html#subclass-object Also: docs.python.org/reference/ …
hyperboreean
Aus diesem in nngeeks Kommentar erwähnten Beitrag geht hervor, dass eine gute stabile Referenz für alten und neuen Stil (nur für Py2 wirklich relevant) lautet: docs.python.org/2/reference/… - die obigen Links schienen zu haben da geändert.
Eric Cousineau
75

Mir ist klar, dass dies eine alte Frage ist, aber es ist erwähnenswert, dass diese beiden Dinge selbst in Python 3 nicht ganz dasselbe sind.

Wenn Sie explizit von erben object, erben Sie tatsächlich von, builtins.object unabhängig davon, worauf dies zu diesem Zeitpunkt hinweist.

Daher könnte ich ein (sehr verrücktes) Modul haben, das aus irgendeinem Grund das Objekt überschreibt. Wir nennen dieses erste Modul "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

Dann in einer anderen Datei ("klasses.py"):

class Greeter(object):
    pass

class NonGreeter:
    pass

Dann in einer dritten Datei (die wir tatsächlich ausführen können):

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

Sie sehen also, dass wir in dem Fall, in dem es explizit vom Objekt erbt, ein anderes Verhalten erhalten als wenn Sie die implizite Vererbung zulassen.

Philip Adler
quelle
1
Dies ist ein nutzloser Kommentar, der von der ursprünglichen Frage und (richtigen) Antwort ablenkt. Wenn Sie eingebaute Elemente ändern, verhält es sich natürlich anders. Tu das nicht.
Harmv
9
Dies ist relevant, da im Allgemeinen erwartet wird, dass das Verhalten gleichwertig ist. Es ist nicht gleichwertig, daher meine Beobachtungen.
Philip Adler