Seite 1 von 1

Vererbung einer Klasse: Was mache ich falsch?

Verfasst: Freitag 29. August 2008, 16:23
von snafu
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.

Verfasst: Freitag 29. August 2008, 16:37
von helduel
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

Verfasst: Sonntag 31. August 2008, 10:08
von snafu
Ok, danke. Ich hätt's halt bequemer gefunden, aber kann man nichts machen...

Verfasst: Sonntag 31. August 2008, 10:10
von name
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)

Verfasst: Sonntag 31. August 2008, 11:00
von Leonidas
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.

Verfasst: Sonntag 31. August 2008, 18:32
von snafu
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.

Verfasst: Sonntag 31. August 2008, 18:44
von 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!?

Verfasst: Sonntag 31. August 2008, 19:12
von Leonidas
Von Modulen "erben" würde eher so aussehen:

Code: Alles auswählen

from deinmodul import *
def deine_weitere_methode():
   ...

Verfasst: Montag 1. September 2008, 09:49
von snafu
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.