it-swarm.com.de

Python Klasse erbt Objekt

Gibt es einen Grund, warum eine Klassendeklaration von object erbt?

Ich habe gerade einen Code gefunden, der dies tut, und ich kann keinen guten Grund dafür finden.

class MyClass(object):
    # class code follows...
1042
tjvr

Gibt es einen Grund, warum eine Klassendeklaration von object erbt?

In Python 3, abgesehen von der Kompatibilität zwischen Python 2 und 3, kein Grund . In Python 2 viele Gründe .


Python 2.x Geschichte:

In Python 2.x (ab 2.2) gibt es zwei Arten von Klassen, je nachdem, ob object als Basisklasse vorhanden ist oder nicht:

  1. Klassen im "klassischen" Stil : Sie haben object nicht als Basisklasse:

    _>>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    _
  2. "neue" Stilklassen : Sie haben direkt oder indirekt (zB erben von einem Eingebauter Typ ), object als Basisklasse:

    _>>> class NewSpam(object):           # directly inherit from object
    ...    pass
    >>> NewSpam.__bases__
    (<type 'object'>,)
    >>> class IntSpam(int):              # indirectly inherit from object...
    ...    pass
    >>> IntSpam.__bases__
    (<type 'int'>,) 
    >>> IntSpam.__bases__[0].__bases__   # ... because int inherits from object  
    (<type 'object'>,)
    _

Zweifellos möchten Sie beim Schreiben einer Klasse immer Klassen neuen Stils wählen. Die Vorteile dabei sind zahlreich, um einige von ihnen aufzulisten:

  • nterstützung für Deskriptoren . Insbesondere werden die folgenden Konstrukte mit Deskriptoren ermöglicht:

    1. classmethod : Eine Methode, die die Klasse als implizites Argument anstelle der Instanz empfängt.
    2. staticmethod : Eine Methode, die das implizite Argument self nicht als erstes Argument empfängt.
    3. eigenschaften mit property : Funktionen zum Verwalten des Abrufens, Einstellens und Löschens eines Attributs erstellen.
    4. __slots__ : Speichert den Speicherverbrauch einer Klasse und führt auch zu einem schnelleren Attributzugriff. Natürlich tut es Einschränkungen auferlegen .
  • Mit der statischen Methode __new__ können Sie anpassen, wie neue Klasseninstanzen erstellt werden.

  • Reihenfolge der Methodenauflösung (MRO) : In welcher Reihenfolge werden die Basisklassen einer Klasse durchsucht, wenn versucht wird, die aufzurufende Methode aufzulösen.

  • Bezogen auf MRO, super Aufrufe . Siehe auch super() als super.

Wenn Sie nicht von object erben, vergessen Sie diese. Eine ausführlichere Beschreibung der vorherigen Aufzählungspunkte zusammen mit anderen Vorteilen der "neuen" Stilklassen finden Sie hier .

Einer der Nachteile von Klassen neuen Stils ist, dass die Klasse selbst mehr Speicher benötigt. Wenn Sie jedoch nicht viele Klassenobjekte erstellen, bezweifle ich, dass dies ein Problem ist, und es ist ein negativer Untergang in einem Meer von Positiven.


Python 3.x Geschichte:

In Python 3 werden die Dinge vereinfacht. Es gibt nur Klassen neuen Stils (einfach als Klassen bezeichnet). Der einzige Unterschied beim Hinzufügen von object besteht darin, dass Sie 8 weitere Zeichen eingeben müssen. Diese:

_class ClassicSpam:
    pass
_

ist völlig gleichwertig (abgesehen von ihrem Namen :-) dazu:

_class NewSpam(object):
     pass
_

und dazu:

_class Spam():
    pass
_

Alle haben object in ihrem ___bases___.

_>>> [object in cls.__bases__ for cls in {Spam, NewSpam, ClassicSpam}]
[True, True, True]
_

Also, was solltest du tun?

In Python 2: immer explizit von object erben. Holen Sie sich die Vorteile.

In Python 3: erben Sie von object, wenn Sie Code schreiben, der versucht, Python Agnostiker zu sein ist, es muss sowohl in Python 2 als auch in Python 3 funktionieren. Ansonsten macht es keinen Unterschied, da Python es für Sie dahinter einfügt die Szenen.

557

Python 3

  • class MyClass(object): = Klasse im neuen Stil
  • class MyClass: = Klasse im neuen Stil (erbt implizit von object)

Python 2

  • class MyClass(object): = Klasse im neuen Stil
  • class MyClass: = ALTE KLASSE

Erläuterung:

Wenn Sie Basisklassen in Python 3.x definieren, dürfen Sie object aus der Definition entfernen. Dies kann jedoch die Tür für ein ernsthaft schwer zu verfolgendes Problem öffnen ...

Python hat Klassen neuen Stils in Python 2.2 eingeführt, und Klassen alten Stils sind mittlerweile ziemlich alt. Die Diskussion über Klassen im alten Stil ist in den 2.x-Dokumenten vergraben und in den 3.x-Dokumenten nicht vorhanden.

Das Problem ist, dass die Syntax für Klassen im alten Stil in Python 2.x mit der alternativen Syntax für Klassen im neuen Stil in Pythonidentisch ist. _ 3.x . Python 2.x wird immer noch sehr häufig verwendet (z. B. GAE, Web2Py), und jeder Code (oder Codierer), der unabsichtlich Klassendefinitionen im 3.x-Stil in 2.x-Code einfügt, wird mit einigen enden ernsthaft veraltete Basisobjekte. Und weil Klassen im alten Stil nicht auf dem Radar von irgendjemandem zu sehen sind, werden sie wahrscheinlich nicht wissen, was sie getroffen hat.

Also buchstabieren Sie es einfach auf die lange Strecke und sparen Sie einigen 2.x-Entwicklern die Tränen.

517
Yarin

Ja, dies ist ein Objekt im neuen Stil. Es war eine Funktion, die in python2.2 eingeführt wurde.

Neue Stilobjekte haben ein anderes Objektmodell als klassische Objekte, und einige Dinge funktionieren bei alten Stilobjekten nicht ordnungsgemäß, z. B. super(), @property und Deskriptoren. Siehe dieser Artikel für eine gute Beschreibung dessen, was eine neue Stilklasse ist.

SO Link für eine Beschreibung der Unterschiede: Was ist der Unterschied zwischen alten und neuen Stilklassen in Python?

397
Jerub

Geschichte von Lerne Python auf die harte Tour :

Pythons ursprüngliche Wiedergabe einer Klasse wurde auf viele ernste Arten gebrochen. Als dieser Fehler erkannt wurde, war es bereits zu spät und sie mussten ihn unterstützen. Um das Problem zu beheben, brauchten sie einen "neuen Klassen" -Stil, damit die "alten Klassen" weiter funktionieren, aber Sie können die neue, korrektere Version verwenden.

Sie beschlossen, ein Word- "Objekt" in Kleinbuchstaben als "Klasse" zu verwenden, von der Sie eine Klasse erben. Es ist verwirrend, aber eine Klasse erbt von der Klasse mit dem Namen "object", um eine Klasse zu erstellen, aber es ist kein Objekt, sondern eine Klasse. Vergessen Sie jedoch nicht, von object zu erben.

Damit Sie auch wissen, worin der Unterschied zwischen Klassen im neuen und im alten Stil besteht, erben Klassen im neuen Stil immer von der Klasse object oder von einer anderen Klasse, die von der Klasse object geerbt wurde:

class NewStyle(object):
    pass

Ein weiteres Beispiel ist:

class AnotherExampleOfNewStyle(NewStyle):
    pass

Während eine Basisklasse im alten Stil so aussieht:

class OldStyle():
    pass

Und eine Kinderklasse im alten Stil sieht so aus:

class OldStyleSubclass(OldStyle):
    pass

Sie können sehen, dass eine Old Style-Basisklasse nicht von einer anderen Klasse erbt. Old Style-Klassen können jedoch natürlich voneinander erben. Die Vererbung von object garantiert, dass bestimmte Funktionen in jeder Klasse Python verfügbar sind. Neue Stilklassen wurden in Python 2.2 eingeführt

30
disp_name

Ja, es ist historisch . Ohne es schafft es eine Klasse im alten Stil.

Wenn Sie type() für ein Objekt im alten Stil verwenden, erhalten Sie nur "instance". Auf einem Objekt neuen Stils erhalten Sie seine Klasse.

28
knitti

Die Syntax der Anweisung zur Klassenerstellung:

class <ClassName>(superclass):
    #code follows

Wenn keine anderen Superklassen vorhanden sind, von denen Sie speziell erben möchten, sollte superclass immer object sein. Dies ist die Wurzel aller Klassen in Python.

object ist technisch die Wurzel von "New-Style" -Klassen in Python. Aber die Klassen im neuen Stil sind heute so gut wie der einzige Unterrichtsstil.

Wenn Sie jedoch beim Erstellen von Klassen nicht explizit das Wort object verwenden, übernimmt Python 3.x implizit die Oberklasse object. Aber ich denke explizit ist immer besser als implizit (Hölle)

Referenz

6
kmario23