Seite 1 von 1

statische attribute verwenden?

Verfasst: Freitag 15. Januar 2010, 17:09
von ska.ndal
hallo,

ich habe mehrere klassen, die miteinander in beziesung stehen, sich aber nicht gegenseitig aufrufen, sondern vom hauptprogramm aufgerufen werden. wie stelle ich es nun sinnvoll an, dass eine klasse auf eine instanz einer andern zugreifen kann? alle instanzen haben eine id.
ich hatte überlegt, dass ich der klasse ein statisches attribut gebe, wo sich jede instanz als element mit id als key reinschreibt (verweis auf self) und ich so von den andern darauf zugreifen kann.
ist das sinnvoll oder bekomme ich mit sowas nur probleme? ist es vielleicht doch besser, das über das hauptprogramm zu machen?

ok, danke.. ska.ndal

Verfasst: Freitag 15. Januar 2010, 18:01
von EyDu
Hallo.

Beschreibe mal genauer, welches Problem du mit deinem Ansatz lösen möchtest, dann ist es einfacher dir zu helfen.

Sebastian

Verfasst: Freitag 15. Januar 2010, 18:07
von BlackJack
@ska.ndal: Hört sich für mich zumindest so erst einmal nicht sinnvoll an. Warum kennen sich die Exemplare der Klassen nicht? Und was meinst Du damit, dass sie eine ID haben? Verwaltest Du neben der Identität, die Objekte sowieso haben, noch extra eine "ausserhalb"? Warum?

Verfasst: Freitag 15. Januar 2010, 18:13
von ska.ndal
@BlackJack: das ganze nimmt daten aus einer db. deshalb hat alles eine id. da aber die beziehungen zwischen den tabellen nicht 1-n, sondern n-m beziehungen sind, kann nicht eine instanz von nur einer "stelle" aus initiiert werden. ist klar was ihc meine, oder soll ich konkreter werden?

Verfasst: Freitag 15. Januar 2010, 18:15
von ska.ndal
@EyDu: deine antwort hatte ich ganz übersehen..
also ich will photos taggen. ein photo kann dabei mehreren tags angehören, einem tag aber auch mehrere photos. habe bis jetzt die klassen photo und tag. irgendwie brauch ich da ne verbindung.

Verfasst: Freitag 15. Januar 2010, 18:41
von cofi
Was macht deine Tags denn so komplex, dass du eine Klasse brauchst? Ansonsten ist das eine `hat-ein`-Beziehung, das heisst, dass die Photo-Klasse seine Tags als Attribut hat.

Fuer mich hoert sich das btw so an, als willst du http://www.sqlalchemy.org/ nutzen.

Verfasst: Freitag 15. Januar 2010, 18:48
von BlackJack
@ska.ndal: Photos bekommen eine Liste für Tags und Tags eine Liste für Photos. Ist doch im Grunde recht einfach!? Da man in der Regel eher Photos Tags zuordnet als umgekehrt, fügt die Methode zum hinzufügen eines Tags, das Photo selbst noch beim Tag hinzu. Ungetestet:

Code: Alles auswählen

class Tag(object):
    def __init__(self, name):
        self.name = name
        self.photos = list()
    
    def __cmp__(self, other):
        return cmp(self.name, other.name)
    
    def __hash__(self):
        return hash(self.name)
    
    def append_photo(self, photo):
        self.photos.append(photo)


class Photo(object):
    def __init__(self):
        self.tags = set()
    
    def add_tag(self, tag):
        if tag not in self.tags:
            self.tags.add(tag)
            tag.append_photo(self)
Oder Du schreibst eine Containerklasse für Photos, die sich um die Verwaltung von Tags, Photos und die Zuordnungen kümmert.

Verfasst: Freitag 15. Januar 2010, 19:11
von ska.ndal
@cofi: ich weiss nicht was sqlalchemy macht, aber es arbeitet mit einer sqlite3-db..
@BlackJack: ich hatte jetz nicht gedacht, dass es "sauber" ist, die verknüpfungen in einer liste zu speichern.

danke euch allen. werde das wohl so in der art dann machen..

Verfasst: Freitag 15. Januar 2010, 20:43
von noisefloor
Hallo,

wenn du eine DB hast, dann brauchst du doch "nur" zu speichern, welches Fotos welche Tags hat.

Wenn du wissen willst, welche Fotos das Tag "foo" haben, dann machst du das über eine Abfrage auf die DB und speicherst das nicht in einer extra Tabelle. Dann hältst du die gleichen Daten an zwei Stellen vor, was immer falsch ist bzw. immer irgendwann schief geht.

SQAlchemy ist ein ORM (Object Relational Mapper), welcher sich auf eine DB "drauf setzt". Für dein Anliegen sicherlich nicht ganz verkehrt.

BTW, es gibt noch andere ORMs ausser SQAlchemy ;-)

Gruß, noisefloor

Verfasst: Freitag 15. Januar 2010, 22:02
von cofi
@OP "es arbeitet"? Meinst du das Programm? Das ist SQLAlchemy recht egal, aber noisefloor hat das ja schon ausgefuehrt.

Ich dachte ebenfalls an eine Datenbankbasierte Loesung. Fuer mich macht die Tag-Klasse keinen Sinn, die DB ist ja dazu da mir alle passenden Tags zurueckzugeben, die muss man nicht reduntant in der Datenbank und im Speicher halten.

Verfasst: Samstag 16. Januar 2010, 19:40
von ska.ndal
danke für die hilfe.. hab mich jetzt entschieden es mit sqlalchemy zu machen

vielen dank.