Seite 1 von 1

OOP: inherited bzw. super Ersatz?

Verfasst: Freitag 6. Juli 2007, 08:42
von PhilippF
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

Re: OOP: inherited bzw. super Ersatz?

Verfasst: Freitag 6. Juli 2007, 08:56
von gerold
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/ ;-)

Verfasst: Freitag 6. Juli 2007, 10:05
von EnTeQuAk
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

Verfasst: Freitag 6. Juli 2007, 10:54
von PhilippF
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

Verfasst: Freitag 6. Juli 2007, 11:23
von EnTeQuAk
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.

Verfasst: Freitag 6. Juli 2007, 11:32
von BlackJack
Zum Thema `super()` sollte man sich folgendes durchlesen:

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

Verfasst: Freitag 6. Juli 2007, 11:47
von Y0Gi
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.

Verfasst: Freitag 6. Juli 2007, 20:43
von Leonidas
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.

Verfasst: Montag 9. Juli 2007, 09:17
von PhilippF
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

Verfasst: Montag 9. Juli 2007, 11:21
von BlackJack
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.)

Verfasst: Montag 9. Juli 2007, 13:18
von mq
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.

Verfasst: Montag 9. Juli 2007, 16:14
von Leonidas
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.