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: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Freitag 29. August 2008, 16:23

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

Freitag 29. August 2008, 16:37

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: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonntag 31. August 2008, 10:08

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:

Sonntag 31. August 2008, 10:10

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 31. August 2008, 11:00

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 Modvoice
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Sonntag 31. August 2008, 18:32

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

Sonntag 31. August 2008, 18:44

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
Administrator
Beiträge: 16024
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Sonntag 31. August 2008, 19:12

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 Modvoice
Benutzeravatar
snafu
User
Beiträge: 5466
Registriert: Donnerstag 21. Februar 2008, 17:31
Wohnort: Gelsenkirchen

Montag 1. September 2008, 09:49

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