Klasse mit Objekt als Parameter

114

Ich versuche, Python-Code in Scala-Code zu übersetzen. Ich bin also ein absoluter Neuling in Python.

Aber warum haben einige Klassen ein Objekt als Parameter, verwenden es jedoch nie explizit? Was ist der Grund dafür, dass es überhaupt ein Parameter ist?

Beispiel:

class Table(object)

Vielen Dank für Ihre Zeit.

mythischer Programmierer
quelle
1
Mögliches Duplikat von alten und neuen
Stilklassen

Antworten:

112

In Python2 wird dies Tableals Klasse neuen Stils deklariert (im Gegensatz zur "klassischen" Klasse). In Python3 sind alle Klassen Klassen neuen Stils, sodass dies nicht mehr erforderlich ist.

Neue Stilklassen haben einige spezielle Attribute, die klassischen Klassen fehlen.

class Classic: pass
class NewStyle(object): pass

print(dir(Classic))
# ['__doc__', '__module__']

print(dir(NewStyle))
# ['__class__', '__delattr__', '__dict__', '__doc__', '__format__', '__getattribute__', '__hash__', '__init__', '__module__', '__new__', '__reduce__', '__reduce_ex__', '__repr__', '__setattr__', '__sizeof__', '__str__', '__subclasshook__', '__weakref__']

Auch Eigenschaften und Super nicht Arbeit mit klassischen Klassen.

In Python2 ist es eine gute Idee, alle Klassen im neuen Stil zu erstellen. (Obwohl viele Klassen in der Standardbibliothek aus Gründen der Abwärtskompatibilität immer noch klassische Klassen sind.)

Im Allgemeinen in einer Aussage wie

class Foo(Base1, Base2):

Foowird als Klasse deklariert, die von Basisklassen Base1und erbt Base2.

objectist die Mutter aller Klassen in Python. Es ist eine neuer Stil - Klasse, so erben objectmacht Tableeine neuen Stil - Klasse.

unutbu
quelle
Können Sie mich zu einer Quelle umleiten, in der erwähnt wird, dass ein Objekt als Parameter in Python3 nicht erforderlich ist? Ich kann es nicht finden. Vielen Dank
Schnee
1
Es wurde schon oft in StackOverflow erwähnt ( hier zum Beispiel ), aber ich konnte keine einfache Erklärung dafür in den Dokumenten finden. Es wird implizit (durch Weglassen von objectaus der Liste der Klassenbasen) im Tutorial gezeigt .
Unutbu
1
In den Python3-Dokumenten heißt es auch, dass eine "Klasse im neuen Stil" der "alte Name für die Variante von Klassen ist, die jetzt für alle Klassenobjekte verwendet werden " (meine Betonung). In den Python2-Dokumenten heißt es, dass eine Klasse im neuen Stil jede Klasse ist, von der geerbt wird object. Die beiden Anweisungen zusammen bedeuten, dass Sie nicht objectin die Liste der Klassenbasen in Python3 aufgenommen werden müssen, da alle Klassen in Python3 Klassen neuen Stils sind.
Unutbu
21

Die TableKlasse erweitert eine Klasse namens object. Es ist kein Argument. Der Grund, warum Sie möglicherweise objectexplizit erweitern möchten, besteht darin, dass die Klasse in eine Klasse neuen Stils umgewandelt wird. Wenn Sie nicht explizit angeben, dass es objectbis Python 3 erweitert wird, handelt es sich standardmäßig um eine Klasse im alten Stil. (Seit Python 3 sind alle Klassen neu, unabhängig davon, ob Sie sie explizit erweitern objectoder nicht.)

Weitere Informationen zu Klassen neuen und alten Stils finden Sie in dieser Frage .

icktoofay
quelle
1
Dies ist die einfachere und prägnantere Antwort. Vielen Dank.
Sabuncu
3

Nur eine Anmerkung, dass die Klassenunterscheidung "neuer Stil" gegen "alter Stil" spezifisch für Python 2.x ist; in 3.x sind alle Klassen "neuer Stil".

Lawrence D'Oliveiro
quelle
2

class Table und class Table (Objekt) unterscheiden sich für Python nicht.

Es ist kein Parameter, sondern erstreckt sich vom Objekt (das wie viele andere Sprachen die Basisklasse ist).

Es heißt nur, dass es alles erbt, was in "Objekt" definiert ist. Dies ist das Standardverhalten.

Devraj
quelle
3
Das automatische Erweitern von Klassen objectist nur in Python 3 Standardverhalten. In Python 2 verfügt ein klassenerweiterendes Objekt über Attribute, die eine Klasse, die das Objekt nicht erweitert, nicht hat.
Lewis Ellis
1

object ist der Basistyp eines in Python definierten Klassenobjekts. Die Attribute des Objekts sind wie folgt zu sehen

** >>> dir (Objekt)

[ ' Klasse ', ' delattr ', ' doc ', ' Format ', ' getAttribute ', ' hash ', ' Init ', ' neu ', ' reduzieren ', ' reduce_ex ', ' repr ', ' setattr ', ' sizeof ',' str ',' subclasshook '] **

Tabelle (Objekt) ist also nur Vererbung.!

Anilkumar Mallakkanavar
quelle
0

1) Klassenname (Objekt): 2) Klassenname: Beide sind gleich, aber der erste ist in Bezug auf das Schreiben ziemlich besser. Er sieht besser aus, wenn andere Klassen an einen anderen geerbt werden. Er sieht homogen aus.

Wie gleich? Wenn also alles in Python unter Objekt fällt, bedeutet dies, dass alles in Python die Eigenschaft eines Objekts hat, wenn es geschrieben wird oder nicht, wird es es verstehen. Im ersten sagen wir es explizit, im zweiten haben wir es nicht gesagt.


quelle
Dies ist in Python 2 nicht der Fall. Einzelheiten finden Sie in der akzeptierten Antwort.
Niemand