2013-03-13 12 views
94

ich gefunden habe, dass die beiden folgenden Arbeiten:Sollten alle Python-Klassen das Objekt erweitern?

class Foo(): 
    def a(self): 
     print "hello" 

class Foo(object): 
    def a(self): 
     print "hello" 

Sollten alle Python-Klassen-Objekt erweitern? Gibt es mögliche Probleme mit dem Objekt nicht zu erweitern?

+1

Ist da gibt es einen Unterschied zwischen 'Klasse Foo():' und 'Klasse Foo:'? Wie ich sehe, funktionieren beide in Python 3. – Wolf

Antwort

87

In Python 2, erbt nicht von object wird eine alten Stil-Klasse erstellen, die unter anderen Effekten, type unterschiedliche Ergebnisse liefern Ursachen:

>>> class Foo: pass 
... 
>>> type(Foo()) 
<type 'instance'> 

gegen

>>> class Bar(object): pass 
... 
>>> type(Bar()) 
<class '__main__.Bar'> 

Auch Die Regeln für die Mehrfachvererbung sind different in einer Weise, die ich hier nicht mal zusammenfassen möchte. Alle gute Dokumentation, die ich über MI gesehen habe, beschreibt neue Klassen.

Schließlich sind Klassen im alten Stil in Python 3 verschwunden und die Vererbung von object ist implizit geworden. Ziehen Sie also immer neue Stilklassen vor, es sei denn, Sie benötigen eine Rückwärtskompatibilität mit alter Software.

2

Ja, alle Python-Klassen sollten das Objekt (oder eher Unterklasse, das ist hier Python) erweitern. Während normalerweise keine ernsthaften Probleme auftreten werden, ist dies in einigen Fällen (wie bei mehreren Vererbungsbäumen) wichtig. Dies sorgt auch für eine bessere Kompatibilität mit Python 3.

+1

genau, technisch, wenn Sie nicht, erhalten Sie eine klassische Klasse, aber es gibt keine wirklichen Vorteile, und es wird nicht von Python 3 sowieso unterstützt –

+0

Ich bin neugierig, warum es die Kompatibilität mit Python3 verbessern. Zu meinem Verständnis, Python3 wird es Objekt automatisch erweitern, auch wenn Sie es nicht angeben, richtig? –

+2

@PaulLo Richtig, aber wenn Sie explizit von Objekt erben, erhalten Sie das gleiche (neue) Verhalten sowohl in Python 2 als auch in Python 3. Es geht nicht darum, zu ändern, wie Python 3 funktioniert, es ist eine Frage der Verwendung Vorwärtskompatibilität auf Python 2. – pydsigner

42

In Python 3 erweitern Klassen implizit object, ob Sie es selbst sagen oder nicht.

In Python 2 gibt es old-style and new-style Klassen. Um zu signalisieren, dass eine Klasse neu ist, müssen Sie explizit von object erben. Wenn nicht, wird die Implementierung im alten Stil verwendet.

Normalerweise möchten Sie eine neue Stilklasse. Erben von object explizit.

+0

Ja, der Unterschied [Free Foo wies darauf hin] (https://stackoverflow.com/a/15374901/2932052), ist weg, BTW: [sind die leeren Klammern optional?] (Https://stackoverflow.com/questions/15374857/sollte-all-python-classes-extend-object # comment66528880_15374857) – Wolf

+2

Es gibt eine Menge Python 3-Code, der foo (object): verwendet. Ist das nur eine Konvention? – RFVenter

+2

@RFVenter Es könnte Code sein, der unter Python 2 und 3 laufen soll, in diesem Fall müssen Sie das Objekt explizit ableiten, damit sich die Klasse unter Python 2 weitgehend gleich verhält. – blubberdiblub

0

In Python3 gibt es keinen Unterschied, aber in Python2 nicht erweitert object gibt Ihnen eine Old-Style-Klassen; Sie möchten eine Klasse im neuen Stil gegenüber einer Klasse im alten Stil verwenden.

+1

Diese Antwort ist vernünftig, aber andere Beantworter sind schneller und/oder genauer gekommen; Diese Antwort fügt der Seite keinen Wert hinzu, wie sie ist. –

11

In Python 3 können Sie eine Klasse auf drei verschiedene Arten erstellen & intern sind sie alle gleich (siehe Beispiele). Es spielt keine Rolle, wie Sie eine Klasse erstellen, alle Klassen in Python 3 erben von einer speziellen Klasse namens Objekt. Die Klasse Objekt ist von grundlegender Bedeutung Klasse in Python und bietet viele Funktionen wie Doppelstrich Methoden, Deskriptoren, super() Methode, eine Eigenschaft() Methode usw.

Beispiel 1.

class MyClass: 
pass 

Beispiel 2

.
class MyClass(): 
pass 

Beispiel 3.

class MyClass(object): 
    pass 
+1

Dies ist nicht streng zutreffend ... https://stackoverflow.com/questions/1238606/is-it-necessary-or-use-ful-to-inherit-from-pythons-object-in-python-3-x/45893772 # 45893772 –

+0

Ich bin mir nicht sicher, ob ich dir folge. Und ja, wahrscheinlich nicht relevant für die meisten Menschen, bis es relevant ist. –

Verwandte Themen