Ich habe festgestellt, dass beide der folgenden Arbeit:
class Foo():
def a(self):
print "hello"
class Foo(object):
def a(self):
print "hello"
Sollten alle Python-Klassen das Objekt erweitern? Gibt es mögliche Probleme, wenn das Objekt nicht erweitert wird?
python
inheritance
Kara
quelle
quelle
class Foo():
undclass Foo:
? Wie ich beobachte, arbeiten beide in Python 3.Antworten:
Wenn Sie in Python 2 nicht von erben,
object
wird eine Klasse im alten Stil erstellt, die unter anderemtype
zu unterschiedlichen Ergebnissen führt:vs.
Auch die Regeln für die Mehrfachvererbung unterscheiden sich in einer Weise, die ich hier nicht einmal zusammenfassen möchte. Alle guten Dokumentationen, die ich über MI gesehen habe, beschreiben Klassen neuen Stils.
Schließlich sind Klassen alten Stils in Python 3 verschwunden, und die Vererbung von
object
ist implizit geworden. Bevorzugen Sie daher immer neue Stilklassen, es sei denn, Sie benötigen Abwärtskompatibilität mit alter Software.quelle
In Python 3 werden Klassen
object
implizit erweitert, unabhängig davon, ob Sie dies selbst sagen oder nicht.In Python 2 gibt es Klassen im alten und neuen Stil . Um zu signalisieren, dass eine Klasse einen neuen Stil hat, müssen Sie explizit von erben
object
. Wenn nicht, wird die Implementierung im alten Stil verwendet.Sie möchten im Allgemeinen eine Klasse neuen Stils. Von
object
explizit erben . Beachten Sie, dass dies auch für Python 3-Code gilt, der mit Python 2 kompatibel sein soll.quelle
In Python 3 können Sie eine Klasse auf drei verschiedene Arten erstellen und intern sind alle gleich (siehe Beispiele). Es spielt keine Rolle, wie Sie eine Klasse erstellen, alle Klassen in Python 3 erben von einer speziellen Klasse namens object . Das Klassenobjekt ist von grundlegender Bedeutung Klasse in Python und bietet viele Funktionen wie Doppelstrich Methoden, Deskriptoren, super () Methode, eine Eigenschaft () Methode usw.
Beispiel 1.
Beispiel 2.
Beispiel 3.
quelle
object
auf eingebaute Bezug genommen wirdobject
. Wenn wir berücksichtigen müssen, dass die in CPython integrierte Kennung ersetzt werden kann, können wir kaum Aussagen über das Datenmodell machen. Kann man ernsthaft argumentieren, dassstr
eine Zeichenfolge nicht immer als Argument akzeptiert wird, weil man sie zuweisen könntebuiltins.str = None
?Ja, alle Python-Klassen sollten das Objekt erweitern (oder besser gesagt Unterklasse, hier ist Python). Während normalerweise keine ernsthaften Probleme auftreten, ist dies in einigen Fällen (wie bei mehreren Vererbungsbäumen) wichtig. Dies gewährleistet auch eine bessere Kompatibilität mit Python 3.
quelle
In Python3 gibt es keinen Unterschied, aber in Python2, wenn Sie nicht erweitern, erhalten
object
Sie Klassen im alten Stil. Sie möchten eine Klasse im neuen Stil gegenüber einer Klasse im alten Stil verwenden.quelle
Wie bereits in anderen Antworten erwähnt, ist die Python 3-Vererbung vom Objekt implizit. Aber sie geben nicht an, was Sie tun sollen und was Konvention ist.
Die Dokumentationsbeispiele für Python 3 verwenden alle den folgenden Stil, der Konvention ist. Ich empfehle daher, diesen für jeden zukünftigen Code in Python 3 zu befolgen.
Quelle: https://docs.python.org/3/tutorial/classes.html#class-objects
Beispielzitat:
Ein weiteres Zitat:
quelle