Seite 1 von 1

Interfaces in Zope

Verfasst: Donnerstag 9. März 2006, 10:45
von reinsn
Hallo,

wie aus der Dokumentation von ZopeX3 zu entnehmen ist, werden Interfaces definiert, indem man von "Interface" aus dem Modul zope.interface quasi erbt. Ich habe mir jetzt diese Modul näher angesehen und bemerkt, dass "Interface" ein Objektinstanz der Klasse InterfaceClass ist.

Jetzt lautet meine Frage, wie kann man generell von Objekten (!) erben? Ich dachte, man kann nur von Klassen erben,

vielen Dank für die Rückmeldung im Voraus!

Verfasst: Donnerstag 9. März 2006, 10:58
von modelnine
Jetzt lautet meine Frage, wie kann man generell von Objekten (!) erben?
Klassen sind Objekte (also Instanzen), wie (fast) alles andere in Python auch, wobei im Gegensatz zu "normalen" Objekten Ihre Klasse nicht object (oder etwas davon abgeleitetes), sondern type (oder etwas davon abgeleitetes) ist.

Siehe auch die Diskussion über Metaklassen auf der Python Homepage, die noch ein bissel mehr Licht in das ganze bringen wird...

Generell von Objekten erben? Nein. Man kann nur von Objekten erben die als Klasse entweder type oder types.classtype (oder wie auch immer die old-style metaklasse heißt) haben.

EDIT: natürlich geht auch eine abgeleitete Klasse von type oder types.classtype als Klasse eines Klassen-Objekts so dass man von Ihr ableiten kann.

Verfasst: Donnerstag 9. März 2006, 15:23
von Joghurt
Stelle es dir grob so vor

Code: Alles auswählen

class Foo(Base):
  f = 42
wird als

Code: Alles auswählen

Foo = type('Foo', ('Base',), {'f': 42})
ausgeführt.

Objekte sind Instanzen von Klassen.
(Newstyle) Klassen sind Instanzen von Metaclassen, type ist so eine Metaklasse.

Verfasst: Donnerstag 9. März 2006, 15:45
von mitsuhiko
Joghurt hat geschrieben:Stelle es dir grob so vor

Code: Alles auswählen

class Foo(Base):
  f = 42
wird als

Code: Alles auswählen

Foo = type('Foo', ('Base',), {'f': 42})
ausgeführt.

Objekte sind Instanzen von Klassen.
(Newstyle) Klassen sind Instanzen von Metaclassen, type ist so eine Metaklasse.
Falsch :-)

Code: Alles auswählen

Foo = type('Foo', (Base,), {'f': 42})
So wirds schon eher gehen ^^