OOP: inherited bzw. super Ersatz?

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.
PhilippF

OOP: inherited bzw. super Ersatz?

Beitragvon PhilippF » Freitag 6. Juli 2007, 08:42

Hallo,

gibt es in Python ein Äquivalent zu inherited in Delphi oder super in Java?

Für die, die die obigen Sprachen nicht kennen, ein Beispiel:

Code: Alles auswählen

class Fahrzeug:
    def Info(self):
        print "Ich bin ein Fahrzeug"

class Auto(Fahrzeug):
    def Info(self):
        super()
        print "Ich bin ein Auto"

a = Auto()
a.Info()


Die Ausgabe sollte sein:

Ich bin ein Fahrzeug
Ich bin ein Auto

Danke & Grüße
Philipp
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5554
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Telfs (Tirol)
Kontaktdaten:

Re: OOP: inherited bzw. super Ersatz?

Beitragvon gerold » Freitag 6. Juli 2007, 08:56

PhilippF hat geschrieben:Die Ausgabe sollte sein:
Ich bin ein Fahrzeug
Ich bin ein Auto

Hallo Philipp!

Willkommen im Python-Forum!

Ersetze ``super()`` durch ``Fahrzeug.Info(self)``.

mfg
Gerold
:-)

PS: Es ist keine so gute Idee, Funktionen/Methoden mit einem Großbuchstaben beginnen zu lassen. Siehe: http://www.python.org/dev/peps/pep-0008/ ;-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Freitag 6. Juli 2007, 10:05

Hallo Philipp!

Gerolds Methode ist vermutlich an schönsten.

Nichts desto Trotz, gehts auch mit 'super':

Code: Alles auswählen

>>> class Fahrzeug(object):
...    def info(self):
...        print "Ich bin ein Fahrzeug"
...
>>> class Auto(Fahrzeug):
...    def info(self):
...        super(Auto, self).info()
...        print "Ich bin ein Auto"
...
>>> a = Auto()
>>> a.info()
Ich bin ein Fahrzeug
Ich bin ein Auto


Ob es da jetzt andere Unterschiede, außer der Schreibung gibt, kann ich dir nicht sagen. Würde mich aber mal interessieren ;)


MfG EnTeQuAk
PhilippF

Beitragvon PhilippF » Freitag 6. Juli 2007, 10:54

Vielen Dank für eure Antworten.

@gerold: Den Stil der Groß/Kleinschreibung habe ich von dem Projekt übernommen, das ich weiterführe. Mal schauen, ob ich es demnächst mal anpasse. Allerdings existieren auch in manchen verbreiteten Libraries groß geschriebene Methoden (z.B. xml.etree.ElementTree). Aber man muss sich ja nicht an den falschen orientieren ;).

@EnTeQuAk: So ähnlich habe ich es auch zunächst probiert. Allerdings wußte ich nicht, dass es bei Python unterschiedliche Klassen-Typen gibt (bin erst eine Woche dabei). Mit dem object-Zusatz funktionert es dann auch.

Danke!
Philipp
EnTeQuAk
User
Beiträge: 986
Registriert: Freitag 21. Juli 2006, 15:03
Wohnort: Berlin
Kontaktdaten:

Beitragvon EnTeQuAk » Freitag 6. Juli 2007, 11:23

PhilippF hat geschrieben:Vielen Dank für eure Antworten.

@gerold: Den Stil der Groß/Kleinschreibung habe ich von dem Projekt übernommen, das ich weiterführe. Mal schauen, ob ich es demnächst mal anpasse. Allerdings existieren auch in manchen verbreiteten Libraries groß geschriebene Methoden (z.B. xml.etree.ElementTree). Aber man muss sich ja nicht an den falschen orientieren ;).

An falschem Sicherlich nicht. Denn richtig ist nur das, was dir am besten gefällt. Jedoch gibt es einen gewissen Standard, den man einhalten sollte. (PEP8)
Weiterhin ist 'ElementTree' eine Klasse. und Klassen werden laut obigem Link in CamelCase geschrieben. Funktionen und Methoden kleingeschrieben und mit '_' getrennt, gleiches für Variablen. Das sind die Grundlagen.
BlackJack

Beitragvon BlackJack » Freitag 6. Juli 2007, 11:32

Zum Thema `super()` sollte man sich folgendes durchlesen:

http://fuhm.org/super-harmful/
Y0Gi
User
Beiträge: 1454
Registriert: Freitag 22. September 2006, 23:05
Wohnort: ja

Beitragvon Y0Gi » Freitag 6. Juli 2007, 11:47

Man bedenke, dass Python Mehrfachvererbung ermöglicht und ein `super()` dagegen nicht eindeutig ist. Das sieht bei Java und Delphi anders aus, da sie nur einfache Vererbung, wohl aber Mehrfach-Schnittstellenvererbung unterstützen.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Freitag 6. Juli 2007, 20:43

BlackJack hat geschrieben:Zum Thema `super()` sollte man sich folgendes durchlesen:

http://fuhm.org/super-harmful/

Ja, das ist eine gute Idee. Wobei ich glaube mich erinnern zu können am letzten Usertreffen von birkenfeld gehört zu haben, dass sich in Python 3.0 auch noch etwas ändern wird.
My god, it's full of CARs! | Leonidasvoice vs Modvoice
PhilippF

Beitragvon PhilippF » Montag 9. Juli 2007, 09:17

EnTeQuAk hat geschrieben:Weiterhin ist 'ElementTree' eine Klasse. und Klassen werden laut obigem Link in CamelCase geschrieben.


Kurze Frage: Wenn ich xml.etree.ElementTree schreibe, ist damit direkt eine Klasse oder ein Modul/Namespace gemeint? Ich meinte zumindest das Modul und dort befinden sich Routinen die Groß geschrieben werden (allerdings ohne Klassenzugehörigkeit).


Grüße
Philipp
BlackJack

Beitragvon BlackJack » Montag 9. Juli 2007, 11:21

Einfach mal nachschauen:

Code: Alles auswählen

In [4]: import xml.etree.ElementTree as ET

In [5]: type(ET)
Out[5]: <type 'module'>


Ist ein Modul. Und die Namen darin…

Code: Alles auswählen

In [6]: dir(ET)
Out[6]:
['Comment',
 'Element',
 'ElementPath',
 'ElementTree',
 'PI',
 'ProcessingInstruction',
 'QName',
 'SubElement',
 'TreeBuilder',
 'VERSION',
 'XML',
 'XMLID',
 'XMLParser',
 'XMLTreeBuilder',
 '_Element',
 '_ElementInterface',
 '_SimpleElementPath',
 '__all__',
 '__builtins__',
 '__doc__',
 '__file__',
 '__name__',
 '_encode',
 '_encode_entity',
 '_escape',
 '_escape_attrib',
 '_escape_cdata',
 '_escape_map',
 '_namespace_map',
 '_raise_serialization_error',
 'dump',
 'fixtag',
 'fromstring',
 'iselement',
 'iterparse',
 'parse',
 're',
 'string',
 'sys',
 'tostring']


…halten sich an PEP 8. Es gibt Klassen in CamelCase und Funktionen in Kleinbuchstaben. (Zumindest könnten die CamelCase-Namen Objekte sein.)
Benutzeravatar
mq
User
Beiträge: 124
Registriert: Samstag 1. Januar 2005, 19:14

Beitragvon mq » Montag 9. Juli 2007, 13:18

Leonidas hat geschrieben:
BlackJack hat geschrieben:Zum Thema `super()` sollte man sich folgendes durchlesen:

http://fuhm.org/super-harmful/

Ja, das ist eine gute Idee. Wobei ich glaube mich erinnern zu können am letzten Usertreffen von birkenfeld gehört zu haben, dass sich in Python 3.0 auch noch etwas ändern wird.
Siehe dazu auch PEP 3135.
Benutzeravatar
Leonidas
Administrator
Beiträge: 16023
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

Beitragvon Leonidas » Montag 9. Juli 2007, 16:14

lumax hat geschrieben:Siehe dazu auch PEP 3135.

Die Referenzimplementation kommt ja direkt aus der Hölle ;) Das erinnert mich etwas an die Vorgehensweise bei LISP, wo man Sprachfeatues einfach so mal schnell implementiert.
My god, it's full of CARs! | Leonidasvoice vs Modvoice

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder