Frage Python-Klasse erbt Objekt


Gibt es einen Grund für eine Klassenerklärung, von der er erbt? object?

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

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

752
2017-10-25 14:15


Ursprung


Antworten:


Gibt es einen Grund für eine Klassenerklärung, von der er erbt? object?

tl; dr: 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, abhängig von der Anwesenheit oder Abwesenheit von object als Basisklasse:

  1. "klassischer Stil Klassen: sie haben nicht object als Basisklasse:

    >>> class ClassicSpam:      # no base class
    ...     pass
    >>> ClassicSpam.__bases__
    ()
    
  2. "neuer Stil Klassen: sie haben direkt oder indirekt (z. B. erben von a 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'>,)
    

Ohne Zweifel, wenn Sie eine Klasse schreiben, werden Sie immer Ich möchte neue Klassen besuchen. Die Vorteile dabei sind zahlreich, um einige von ihnen aufzulisten:

  • Unterstü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 nicht erhält self als erstes Argument.
    3. Eigenschaften mit property: Erstellen Sie Funktionen zum Verwalten des Abrufens, Festlegens und Löschens eines Attributs.
    4. __slots__: Speichert den Speicherverbrauch einer Klasse und führt auch zu einem schnelleren Zugriff auf Attribute. Natürlich tut es das Beschränkungen auferlegen.
  • Das __new__ statische Methode: Ermöglicht die Anpassung, wie neue Klasseninstanzen erstellt werden.

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

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

Wenn Sie nicht von erben objectVergiss diese. Eine erschöpfende Beschreibung der vorherigen Aufzählungspunkte zusammen mit anderen Vorteilen von "neuen" Stilklassen kann gefunden werden Hier.

Einer der Nachteile neuer Klassen ist, dass die Klasse selbst mehr Speicher beansprucht. Wenn Sie jedoch nicht viele Klassenobjekte erstellen, bezweifle ich, dass dies ein Problem wäre, und es ist ein negativer Sinken in einem Meer von positiven Dingen.


Python 3.x Geschichte:

In Python 3 sind die Dinge vereinfacht. Es gibt nur Klassen im neuen Stil (die einfach als Klassen bezeichnet werden), also der einzige Unterschied beim Hinzufügen object erfordert, dass Sie 8 weitere Zeichen eingeben. Dies:

class ClassicSpam:
    pass

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

class NewSpam(object):
     pass

und dazu:

class Spam():
    pass

alle haben object in ihren __bases__.

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

Also, was solltest du tun?

In Python 2:  erben immer von object ausdrücklich. Holen Sie sich die Vorteile.

In Python 3: geerbt von object Wenn Sie Code schreiben, der unabhängig von Python sein soll, muss er sowohl in Python 2 als auch in Python 3 funktionieren. Ansonsten tun Sie nichts, denn Python fügt ihn hinter den Kulissen für Sie ein.


243
2017-07-12 15:34



Python 3.x:
class MyClass(object): = neue Stilklasse
class MyClass: = new-style class (implizit erbt von object)

Python 2.x:
class MyClass(object): = neue Stilklasse
class MyClass: = Old-Style-Klasse

Erläuterung:

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

Python führte neue Klassen in Python 2.2 ein, und alte Klassen sind mittlerweile ziemlich alt. Diskussion von Old-Style-Klassen ist begraben in den 2.x Dokumentenund nicht vorhanden in den 3.x-Dokumenten.

Das Problem ist, Die Syntax für alte Klassen in Python 2.x ist dieselbe wie die alternative Syntax für neue Stilklassen in Python 3.x. Python 2.x wird immer noch sehr häufig verwendet (z. B. GAE, Web2Py), und jeder Code (oder Coder), der unbeabsichtigt Klassifizierungsdefinitionen im 3.x-Stil in den 2.x-Code bringt, wird mit einigen ernsthaft veralteten Basisobjekten enden. Und weil alte Klassen nicht auf dem Radar sind, werden sie wahrscheinlich nicht wissen, was sie getroffen hat.

Also buchstabieren Sie es einfach den langen Weg und speichern Sie einige 2.x Entwickler die Tränen.


494
2018-02-25 21:15



Ja, das ist ein 'neues Stil' Objekt. Es war ein Feature, das in python2.2 eingeführt wurde.

Neue Stilobjekte haben ein anderes Objektmodell als klassische Objekte, und manche Dinge funktionieren beispielsweise nicht korrekt mit alten Stilobjekten. super(), @property und Deskriptoren. Sehen 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 Stil und neuen Stilklassen in Python?


388
2017-10-25 14:20



Geschichte von Lerne Python auf die harte Tour:

Pythons ursprüngliche Wiedergabe einer Klasse wurde in vielen ernsthaften gebrochen   Wege. Als dieser Fehler erkannt wurde, war es schon zu spät,   und sie mussten es unterstützen. Um das Problem zu beheben, benötigten sie   einige "neue Klasse" Stil, so dass die "alten Klassen" weiter arbeiten würden   aber Sie können die neue korrektere Version verwenden.

Sie entschieden, dass sie ein Wort "Objekt", kleingeschrieben, verwenden würden   die "Klasse", von der Sie erben, um eine Klasse zu erstellen. Es ist verwirrend,   aber eine Klasse erbt von der Klasse namens "object", um eine Klasse zu erstellen   es ist kein Objekt, es ist wirklich eine Klasse, aber vergiss nicht zu erben   vom Objekt.

Auch um Sie wissen zu lassen, was der Unterschied zwischen New-Style-Klassen und Old-Style-Klassen ist, erben neue Klassen immer von object Klasse oder von einer anderen Klasse, die von geerbt hat object:

class NewStyle(object):
    pass

Ein anderes Beispiel ist:

class AnotherExampleOfNewStyle(NewStyle):
    pass

Während eine alte Basisklasse wie folgt aussieht:

class OldStyle():
    pass

Und eine altmodische Kinderklasse sieht so aus:

class OldStyleSubclass(OldStyle):
    pass

Sie können sehen, dass eine Old Style-Basisklasse nicht von einer anderen Klasse erbt, jedoch können Old Style-Klassen natürlich voneinander erben. Vererben von Objekt garantiert, dass bestimmte Funktionalität in jeder Python-Klasse verfügbar ist. Neue Stilklassen wurden in Python 2.2 eingeführt


29
2017-11-04 10:54



Ja es ist historisch. Ohne es erstellt es eine Klasse im alten Stil.

Wenn du benutzt type() Bei einem Objekt im alten Stil erhält man nur "Instanz". Bei einem Objekt im neuen Stil erhält man seine Klasse.


23
2017-10-25 14:20



Die Syntax der Klassenerstellungsanweisung:

class <ClassName>(superclass):
    #code follows

Wenn keine anderen Superklassen vorhanden sind, von denen Sie spezifisch übernehmen möchten, wird die superclass sollte immer sein objectDies ist die Wurzel aller Klassen in Python.

object ist technisch die Wurzel von "New-Style" -Klassen in Python. Aber die Klassen des neuen Stils sind heute so gut wie der einzige Klassenstil.

Aber wenn Sie das Wort nicht explizit verwenden object Beim Erstellen von Klassen erbt Python 3.x, wie bereits erwähnt, implizit von object Oberklasse. Aber ich denke, explizit ist immer besser als implizit (Hölle)

Referenz


6
2017-10-20 05:37



Dies schafft ein neue Klasse.


1
2017-10-25 14:20