109 Stimmen

Ist es notwendig oder sinnvoll, von Python Objekt in Python 3.x erben?

Wenn Sie in älteren Python-Versionen eine Klasse erstellen, kann diese von object was, soweit ich weiß, ein spezielles eingebautes Python-Element ist, das es Ihrer Klasse erlaubt, eine New-Style-Klasse zu sein.

Was ist mit neueren Versionen (> 3.0 und 2.6)? Ich habe gegoogelt über die object Klasse, aber ich erhalte so viele Ergebnisse (aus offensichtlichen Gründen).

2 Stimmen

Wenn Ihr Code auch unter 2.x verwendet werden soll, ist es gut, dies explizit zu sagen.

2 Stimmen

In dieser Frage wird sie gut beantwortet: stackoverflow.com/questions/4015417/

118voto

SilentGhost Punkte 285785

Sie brauchen nicht zu erben von object um einen neuen Stil in Python 3 zu haben. Alle Klassen sind new-style.

9 Stimmen

Beachten Sie, dass dies bedeutet, dass alle Klassen erben von object unabhängig davon, ob die Eingabe einer expliziten (object) oder nicht in Python 3.1

9 Stimmen

Sie müssen es nicht, aber die "Portierung von Python-Code auf Python 3" sagt, dass es immer noch gültig ist: docs.python.org/py3k/howto/pyporting.html#subclass-object Auch: docs.python.org/reference/

0 Stimmen

De diese Stelle erwähnt in nngeek Kommentar, scheint wie eine gute stabile Referenz für Old-Style vs. New-Style (nur wirklich relevant für Py2) ist: docs.python.org/2/reference/ - Die oben genannten Links scheinen sich inzwischen geändert zu haben.

94voto

Philip Adler Punkte 2009

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

Wenn Sie explizit erben von object vererben Sie eigentlich von builtins.object unabhängig davon, worauf das zu diesem Zeitpunkt hindeutet.

Daher könnte ich einige (sehr verrückte) Modul, das Objekt aus irgendeinem Grund überschreibt haben. Wir werden dieses erste Modul "newobj.py" nennen:

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 explizit von object geerbt wird, ein anderes Verhalten erhalten, als wenn Sie die implizite Vererbung zulassen.

19 Stimmen

Das ist relevant, weil man im Allgemeinen erwartet, dass das Verhalten gleichwertig ist. Es ist nicht gleichwertig, daher meine Beobachtungen.

14 Stimmen

Hasst du es nicht auch, wenn jemand seine Kommentare löscht, so dass es aussieht, als ob du mit dir selbst sprichst?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X