Hallo Zusammen,
gibt es eine Möglichkeit einen vorhanden Baum soweit zu löschen, dass nur die Wurzel sowie die Kinder der Wurzel erhalten bleiben und alles andere gelöscht wird?
ps. gibts ne Möglichkeit Klassen "static" zu deklarieren?
Gruß Phill
Baumstruktur "neu" Erstellen
@phill: Äh!? Gegenfrage: Ist es möglich eine verkettete Liste soweit zu löschen, dass nur noch das erste Element und dessen Nachfolger übrig ist?
In beiden Fällen lautet die Antwort: Theoretisch natürlich, aber wie sieht denn die Implementierung aus?
Also wenn ich den Baum implementiert hätte, würde die Antwort vielleicht so aussehen:
Wobei natürlich "löschen" eine ziemlich "harte" Aussage ist. Man kann in Python keine Objekte löschen. Nur Referenzen auf Objekte entfernen. Die Implementierun von `remove_children()` würde also dafür sorgen, dass in den Knoten keine Kinder mehr referenziert werden.
Zum p.s.: In einer dynamischen Sprache etwas statisch deklarieren zu wollen, klingt so als wenn man gegen die Sprache arbeiten wollte, statt mit ihr.
Allerdings könntest Du mal erklären was Du hier mit ``static`` meinst und warum Du denkst so etwas zu benötigen.
In beiden Fällen lautet die Antwort: Theoretisch natürlich, aber wie sieht denn die Implementierung aus?
Also wenn ich den Baum implementiert hätte, würde die Antwort vielleicht so aussehen:
Code: Alles auswählen
for child in root:
child.remove_children()
Zum p.s.: In einer dynamischen Sprache etwas statisch deklarieren zu wollen, klingt so als wenn man gegen die Sprache arbeiten wollte, statt mit ihr.
Allerdings könntest Du mal erklären was Du hier mit ``static`` meinst und warum Du denkst so etwas zu benötigen.
Eine `static` Klasse braucht doch nicht instanziert zu werden um auf Funktionen der Klasse zugreifen zu können. Das ganze ist doch dann nur noch eine Bibliothek. In Sprachen die rein objektorientiert sind versteh ich das noch, Python gehört ja aber nicht dazu. Also wäre hier `static`nur ein Mittel, daß es objektorientiert aussieht, oder seh ich das falsch?
Discuss
alpha
Discuss
alpha
@alpha: Das siehst Du falsch: Python ist rein *objekt*orientiert. Nur nicht rein *klassen*basiert. In Python ist alles, was man an einen Namen binden kann, ein Objekt. Aber nicht jedes Objekt muss durch eine Klasse definiert werden. Module und Funktionen sind auch Objekte.
Hey
Danke für die Antworten wenn ich also den richtigen Knoten an remove_children übergebe müsste es funktionieren das ist ja schonmal was
Dann zu meiner Static sache.
Ich importiere mehrere File in verschiedenen Formaten und Parse den Inhalt in eine Klasse die als "Datenabnk" fungieren soll. Aus dieser Datenbank muss nun aber der Baum seine Daten beziehen. D.h. sobald sich was in der Datenbank geändert hat muss die Baum-Klasse benachrichtigt werden. Wenn nun die Datenbank static ist, brauch ich keine Instanziierung sondern kann einach während dem foo.setchanged() auf die Felder zugreifen.
Deswegen war mein erster gedanke static....
Grüße
Danke für die Antworten wenn ich also den richtigen Knoten an remove_children übergebe müsste es funktionieren das ist ja schonmal was
Dann zu meiner Static sache.
Ich importiere mehrere File in verschiedenen Formaten und Parse den Inhalt in eine Klasse die als "Datenabnk" fungieren soll. Aus dieser Datenbank muss nun aber der Baum seine Daten beziehen. D.h. sobald sich was in der Datenbank geändert hat muss die Baum-Klasse benachrichtigt werden. Wenn nun die Datenbank static ist, brauch ich keine Instanziierung sondern kann einach während dem foo.setchanged() auf die Felder zugreifen.
Deswegen war mein erster gedanke static....
Grüße
@BlackJack:
Einverstanden, da habe ich mich falsch ausgedrückt. Natürlich ist in Python alles ein Objekt.
@Phill:
Variablen die direkt im Klassenrumpf definiert werden, werden (soweit ich weiss) nicht instanziert.
Bsp:
Allerdings bin ich etwas verwirrt. Laut
http://www.python-forum.de/topic-18947.html
sollte in jeder Instanz "data" gleich sein.. ist es bei meinen Tests aber nicht...
Vieleicht kann mir das jemand erklären der mehr Ahnung hat.
alpha
Einverstanden, da habe ich mich falsch ausgedrückt. Natürlich ist in Python alles ein Objekt.
@Phill:
Variablen die direkt im Klassenrumpf definiert werden, werden (soweit ich weiss) nicht instanziert.
Bsp:
Code: Alles auswählen
class test:
data=[]
http://www.python-forum.de/topic-18947.html
sollte in jeder Instanz "data" gleich sein.. ist es bei meinen Tests aber nicht...
Vieleicht kann mir das jemand erklären der mehr Ahnung hat.
alpha
- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Das ist richtig, denn `data` ist hier Klassenattribut.
Erklären kann ich mir das atm nur so, dass du es in den Tests entweder überschreibst oder dass es mit der Verwendung von old-style Klassen zusammenhängt, wobei letzteres ziemlich unwahrscheinlich ist. In meinem Test mit old-style Klassen tritt es jedenfalls nicht auf:
Erklären kann ich mir das atm nur so, dass du es in den Tests entweder überschreibst oder dass es mit der Verwendung von old-style Klassen zusammenhängt, wobei letzteres ziemlich unwahrscheinlich ist. In meinem Test mit old-style Klassen tritt es jedenfalls nicht auf:
Code: Alles auswählen
In [1]: class test:
...: data = []
In [2]: a = test()
In [3]: b = test()
In [4]: a.data.append(1)
In [5]: a.data
Out[5]: [1]
In [6]: b.data
Out[6]: [1]
Hier mein Versuch
Ich hab Python 2.5.4
Code: Alles auswählen
>>> class test:
data = []
>>> a = test()
>>> b = test()
>>> a.data = [1,2,3]
>>> b.data
[]
>>> a.data
[1, 2, 3]
>>>
Aha.. so ganz ist mir ja nicht klar wieso ein Anhängen eines Elements ein anderes Verhalten zeigt als ein zuweisen eines neuen Wertes.
Im einen Fall vergrössere ich die Datenstruktur im anderen Fall übergebe ich eine komplett neue.
Wo ist da der Denkfehler?
alpha
Im einen Fall vergrössere ich die Datenstruktur im anderen Fall übergebe ich eine komplett neue.
Wo ist da der Denkfehler?
alpha
@alpha: ``a.data = [1, 2, 3]`` erzeugt auf dem Exemplar von `a` ein Attribut mit dem Namen `data`.
Wenn Du danach `a.data` anfragst, wird im Exemplar nachgeschaut, `data` gefunden und die Liste zurückgegeben.
Bei `b.data` wird im Exemplar nachgeschaut -- da gibt's aber kein Attribut mit dem Namen `data`, also wird in der Klasse nachgeschaut, und da ist eben die leere Liste an das `data`-Attribut gebunden.
Wenn Du danach `a.data` anfragst, wird im Exemplar nachgeschaut, `data` gefunden und die Liste zurückgegeben.
Bei `b.data` wird im Exemplar nachgeschaut -- da gibt's aber kein Attribut mit dem Namen `data`, also wird in der Klasse nachgeschaut, und da ist eben die leere Liste an das `data`-Attribut gebunden.
Das liegt daran, wie die Namen aufgelöst werden: wenn du ein Attribut anforderst, wird zunächst geprüft ob die Instanz (auf welche sich das Attribut bezieht) ein solches Attribut besitzt. Ist das der Fall bekommst du dieses zurück. Andernfalls wird in der Klasse der Instanz nach dem Attribut zurück. Kann es dort auch nicht gefunden werden, werden alle Elternklassen geprüft.
Bei einer Zuweisung eines Attributs wird dieses immer direkt an die Instanz gebunden. Damit wird die Suche später sofort abgebrochen und nicht weiter in den Klassen nachgeschaut.
Wenn du also ein Objekt änderst, wie hier mit "append", wird es in der Klasse gefunden und zurückgegeben und verändert. Die Instanz wird nicht angefasst.
Bei einer Zuweisung eines Attributs wird dieses immer direkt an die Instanz gebunden. Damit wird die Suche später sofort abgebrochen und nicht weiter in den Klassen nachgeschaut.
Wenn du also ein Objekt änderst, wie hier mit "append", wird es in der Klasse gefunden und zurückgegeben und verändert. Die Instanz wird nicht angefasst.
Das Leben ist wie ein Tennisball.
Danke für die ausführlichen Erklärungen. Mir war nicht klar dass a.data in der Klasse von a.date (Instanz) überschrieben wird. Ich bin davon ausgegangen das z.b a.daaaata = 4 zu einem Fehler geführt hätte... dem ist aber nicht so.. Es soll ja Sprachen geben da wäre dies der Fall
CU
alpha
CU
alpha
Hey Jungs
mitlerweile hab ich das mit dem baum hinbekommen...
aber ich gehe also richtig in der annahme das in python kein static gibt ( so wie ich es z.b. in java benutzen kann)?
gruß
mitlerweile hab ich das mit dem baum hinbekommen...
aber ich gehe also richtig in der annahme das in python kein static gibt ( so wie ich es z.b. in java benutzen kann)?
gruß
@Dill: ``static``-Klassen sind nicht exotisch, sondern immer dann sinnvoll, wenn man eine innere Klasse hat, die nicht auf die umgebende Klasse zugreift. Das ist auch die einzige Stelle wo Java es erlaubt eine Klasse als ``static`` zu deklarieren IIRC. Bei Top-Level-Klassen lässt der Compiler jedenfalls kein ``static`` durchgehen.
@phill: Nochmal die Frage, was meinst Du mit ``static``? An welcher Stelle möchtest Du das benutzen und wie soll die Semantik aussehen? ``static``-Felder aus Java sind Klassenattribute in Python und statische Methoden kann man mit `staticmethod()` erzeugen. Man sollte aber IMHO einen guten Grund dafür haben, warum man das will, statt eine Funktion zu definieren oder `classmethod()` zu verwenden. Ansonsten beschreib doch einfach mal einen Anwendungsfall mit einer Java-Klasse. Dann kann man besser helfen das in Python zu übersetzen.
@phill: Nochmal die Frage, was meinst Du mit ``static``? An welcher Stelle möchtest Du das benutzen und wie soll die Semantik aussehen? ``static``-Felder aus Java sind Klassenattribute in Python und statische Methoden kann man mit `staticmethod()` erzeugen. Man sollte aber IMHO einen guten Grund dafür haben, warum man das will, statt eine Funktion zu definieren oder `classmethod()` zu verwenden. Ansonsten beschreib doch einfach mal einen Anwendungsfall mit einer Java-Klasse. Dann kann man besser helfen das in Python zu übersetzen.
hey
das mit dem static hat sich erledigt habs auch ohne hinbekommen und ich glaube es ist so einfach schöner....
nun hab ich aber nen anderes Problem. In java gibt es eine Methode auf String die sich Pattern.Match() nennt und man kann damit die Suche nach regulären Ausdrücken implementieren? Gibt es sowas in Python auch?
Ich suche also nach einem bestimmten Muster in einem String. Wobei das Muster auch ein String ist.
Gruß Phil
ps. Das statich sollte sein damit ich ohne eine Instanz der Klasse ein Objekt dieser Klasse hin und her schieben kann. Ich meine damit 2 Klassen müssen auf die Attribute der 3 Klasse zugreifen und ich dachte mir das man die 3 klasse dann am besten static machen kann. Dem ist aber nicht so...
das mit dem static hat sich erledigt habs auch ohne hinbekommen und ich glaube es ist so einfach schöner....
nun hab ich aber nen anderes Problem. In java gibt es eine Methode auf String die sich Pattern.Match() nennt und man kann damit die Suche nach regulären Ausdrücken implementieren? Gibt es sowas in Python auch?
Ich suche also nach einem bestimmten Muster in einem String. Wobei das Muster auch ein String ist.
Gruß Phil
ps. Das statich sollte sein damit ich ohne eine Instanz der Klasse ein Objekt dieser Klasse hin und her schieben kann. Ich meine damit 2 Klassen müssen auf die Attribute der 3 Klasse zugreifen und ich dachte mir das man die 3 klasse dann am besten static machen kann. Dem ist aber nicht so...