Das Problem ist nicht das `SubElement`, sondern `find`. Du kannst natuerlich im gesamten Baum nach einem passenden Vater suchen, aber dann durchsuchst du a) den gesamten Baum und b) hast du das Problem von mehreren Kandidaten.
Stellt sich die Frage, warum du die Funktionalitaet von ElementTree nochmal in einen unflexibleren Wrapper packen willst. Uebrigens, dein `prettify` Aufruf tut nichts.
ElementTree (XML) speichert alles in eine Zeile?
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
- pillmuncher
- User
- Beiträge: 1530
- Registriert: Samstag 21. März 2009, 22:59
- Wohnort: Pfaffenwinkel
Nein, nicht richtig. Ich weiß nicht, welches Tutorial du verwendest, aber wenn da steht, dass in Python irgendwas protected wäre, ist es ein schlechtes Tutorial, weil das eben nicht stimmt.kaineanung hat geschrieben:Auch wenn ich immer noch nicht ganz verstehe warum ich in der Klasse keine echten 'private'-Funktionen benutzen soll sondern die 'protected'. Das erste wird laut python-tutorial mit doppelten Unterstrichen deklariert und das Zweite, also die protected-Funktionen, nur mit einem Unterstrich.
private ist laut Tutorial definitiv privat und nicht überladbar in vererbten Klassen und protected eben nur 'semi-privat'. Man soll sie nicht ändern, man kann sie ändern in einer vererbten Klasse.
Nun gut, das ist ja wohl die Philosophie von OOP und dem Überladen und sicherlich ist es dem geschuldet daß ihr mir sagt die Funktionen sollen protected sein, richtig?
Attributnamen mit einem führenden Unterstrich bedeuten: ist ein Implementierungsdetail und gehört nicht zur öffentlichen Schnittstelle. Die öffentliche Schnittstelle ist das, was man benutzen soll, aber nichts hindert einen daran, auch auf Implementierungsdetails zuzugreifen. Man tut das dann aber auf eigenes Risiko, denn manchmal funktioniert etwas nicht mehr, wenn man von außen an Implementierungsdetails rumfummelt. Außerdem können sich die Implementierungsdetails in der nächsten Version ohne Vorwarnung ändern, so dass dann Code, der darauf zugreift evtl. nicht mehr funktioniert.
Attributnamen mit zwei führenden Unterstrichen, die nicht mit zwei Unterstrichen enden, unterliegen dem sog. private name mangling. Das bedeutet, der tatsächliche Name wird umgebastelt, so dass der Klassenname mit hineingewurstelt wird. Dadurch können bei Mehrfachvererbung zwei Basisklassen Attribute mit denselben Namen haben ohne sich in die Quere zu kommen. Aber das Mangling ist genau definiert. Wenn ein Attribut __foo in einer Klasse Bar definiert ist, dann wird daraus der Name _Bar__foo, und den kann ich verwenden, denn in Python ist eben nichts privat:
Code: Alles auswählen
In [1]: class Bar:
...: __foo = 1
...:
In [2]: Bar._Bar__foo
Out[2]: 1
In [3]: Bar._Bar__foo = 2
In [4]: Bar._Bar__foo
Out[4]: 2
In specifications, Murphy's Law supersedes Ohm's.
-
- User
- Beiträge: 145
- Registriert: Sonntag 5. April 2015, 20:57
@pillmuncher
Dank deiner detaillierten Ausführung habe ich es jetzt verstanden! Vielen Dank!
Ich habe es aus
https://www.hdm-stuttgart.de/~maucher/P ... assen.html
Unter Punkt 6.1.3. Sichtbarkeit:
@cofi
Ich werde bis morgen meine Klasse auflösen und ET direkt in meinem 'Haupt'-Code verwenden.
Dann hat sich wohl auch die Frage erledigt wie ich das Unter-Unter-Node finde weil ich dann da 'hinnavigieren' kann mit
Dank deiner detaillierten Ausführung habe ich es jetzt verstanden! Vielen Dank!
Ich habe es aus
https://www.hdm-stuttgart.de/~maucher/P ... assen.html
Unter Punkt 6.1.3. Sichtbarkeit:
Das 'nicht sichtbar' habe ich wohl überlesen und auch nicht weiter verfolgt weil ich es ja doch benutzen konnte (bevor ich den Code verbessert habe hatte ich die Funktionen mit Doppelt-Unterstrich versehen).private Attribute und Methoden sind von aussen nicht sichtbar. Attribute und Methoden werden als private deklariert, indem man ihren Namen mit dem Prefix __ (doppelter Unterstrich) versieht.
@cofi
Ich werde bis morgen meine Klasse auflösen und ET direkt in meinem 'Haupt'-Code verwenden.
Dann hat sich wohl auch die Frage erledigt wie ich das Unter-Unter-Node finde weil ich dann da 'hinnavigieren' kann mit
Code: Alles auswählen
.find("Node').find("SubNode1").find("SubNode2")...
@kaineanung: vergleich doch mal Dein add_node mit add_subnode! Beide machen fast das gleiche, nur das eine mit SubElement:
Natürlich kann man find auch über mehrere Ebenen benutzen. Man sollte einfach mal die Dokumentation lesen. Aber das ist doch beim Erzeugen sowieso unnötig, weil da kennt man ja die Nodes.
Code: Alles auswählen
def add_node(self, nodename, value=""):
ET.SubElement(self._root, nodename).text = value