Baumstruktur "neu" Erstellen

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.
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

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
BlackJack

@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:

Code: Alles auswählen

    for child in root:
        child.remove_children()
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.
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

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
BlackJack

@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.
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

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
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

@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:

Code: Alles auswählen

class test:
    data=[]
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
Benutzeravatar
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:

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]
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

@alpha: zeig uns mal deinen Test und was du für ein Ergebnis erwartest. Dann lässt sich wahrscheinlich etwas leichter erklären was du falsch verstanden hast.
Das Leben ist wie ein Tennisball.
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

Hier mein Versuch

Code: Alles auswählen

>>> class test:
	data = []

	
>>> a = test()
>>> b = test()
>>> a.data = [1,2,3]
>>> b.data
[]
>>> a.data
[1, 2, 3]
>>>
Ich hab Python 2.5.4
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Kein Wunder, dass es nicht funktioniert.
Du überschreibst `a.data`, dh du definierst `self.data` für deine Instanz `a` und verdeckst damit den Zugriff auf `test.data`.
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

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
BlackJack

@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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

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.
Das Leben ist wie ein Tennisball.
alpha
User
Beiträge: 195
Registriert: Freitag 23. Mai 2003, 23:24
Wohnort: Ulm

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
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

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ß
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

was willst du denn mit dem static? statische klassen sind auch in java eher exotisch, ich glaube kaum, dass du die dort schonmal (sinnvoll) verwendet hast).
http://www.kinderpornos.info
BlackJack

@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.
Benutzeravatar
Dill
User
Beiträge: 470
Registriert: Mittwoch 10. Januar 2007, 14:52
Wohnort: Köln

das ist mir bewusst, ich glaube nur nicht, dass er das meint...
http://www.kinderpornos.info
phill
User
Beiträge: 34
Registriert: Donnerstag 21. Mai 2009, 12:04
Kontaktdaten:

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