Vererbung einer Klasse: Was mache ich falsch?

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Hallo!

Ich möchte, dass meine Klasse ImageTool alle Eigenschaften des Moduls Image erbt. Die Fehlermeldung, die ich dann bekomme, kann ich leider nicht nachvollziehen. Wäre dankbar, wenn mich jemand aufklären könnte :) :

Code: Alles auswählen

In [1]: import imagetool
---------------------------------------------------------------------------
<type 'exceptions.TypeError'>             Traceback (most recent call last)

/home/sebastian/<ipython console> in <module>()

/home/sebastian/imagetool.py in <module>()
      1 import Image
      2 
----> 3 class ImageTool(Image):
      4     pass

<type 'exceptions.TypeError'>: Error when calling the metaclass bases
    module.__init__() takes at most 2 arguments (3 given)
Anmerkung: Der Quelltext hat bisher nur die 4 Zeilen, die auch in der Fehlermeldung aufgeführt werden.
Benutzeravatar
helduel
User
Beiträge: 300
Registriert: Montag 23. Juli 2007, 14:05
Wohnort: Laupheim

Moin,

Klassen können nicht von Modulen erben, sondern nur von anderen Klassen:

Code: Alles auswählen

import Image

class ImageTool(Image.Image):
    pass

Gruß,
Manuel
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ok, danke. Ich hätt's halt bequemer gefunden, aber kann man nichts machen...
Benutzeravatar
name
User
Beiträge: 254
Registriert: Dienstag 5. September 2006, 16:35
Wohnort: Wien
Kontaktdaten:

snafu hat geschrieben:Ok, danke. Ich hätt's halt bequemer gefunden, aber kann man nichts machen...
Inwiefern bequemer. Es ist was ganz anderes und obendrein falsch. Hätte die PIL nach PEP8 benannt, wär das nicht passiert (dann hätte das Modul image und die Klasse Image geheißen)
Ohloh | Mein Blog | Jabber: segfaulthunter@swissjabber.eu | asynchia – asynchrone Netzwerkbibliothek

In the beginning the Universe was created. This has made a lot of people very angry and has been widely regarded as a bad move.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

snafu hat geschrieben:Ich hätt's halt bequemer gefunden, aber kann man nichts machen...
Das sind zwei verschiedene Sachen, das ist als würdest du sagen du willst von der CPU erben, weil das bequemer ist. Klingt nach Nonsense? Ist es auch.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Ich wollte einfach das Modul um eigene Methoden erweitern, oder eben anders gesagt: Die vorhandenen Funktionen von Image übernehmen und eigene dazu schreiben. Zb. dachte ich an sowas wie relative_resize, also eine Funktion, bei der man nur die Breite ODER die Höhe angeben muss und er passt die andere Seite automatisch im gleichen Verhältnis an.
BlackJack

Module haben keine Methoden, Du willst eine *Klasse* um Methoden erweitern. Und genau das kannst Du doch auch machen. Dazu musst Du halt von einer Klasse erben und nicht von einem Modul. Ich verstehe das mit dem "(un)bequem" ehrlich gesagt auch nicht!?
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Von Modulen "erben" würde eher so aussehen:

Code: Alles auswählen

from deinmodul import *
def deine_weitere_methode():
   ...
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
snafu
User
Beiträge: 6738
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Stimmt, den Stern-Import hatte ich total verdrängt. :oops:

BlackJack: Leider ist bei Image nicht alles in Klassen verpackt. Die Klasse Image des Moduls Image sollte man auch nicht direkt benutzen, wenn ich das im Quelltext richtig verstanden habe. Und so Sachen wie "open" sind da halt in keiner Klasse verpackt.
Antworten