statische attribute verwenden?

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.
Antworten
ska.ndal
User
Beiträge: 24
Registriert: Freitag 6. November 2009, 16:02

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

Hallo.

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

Sebastian
Das Leben ist wie ein Tennisball.
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?
ska.ndal
User
Beiträge: 24
Registriert: Freitag 6. November 2009, 16:02

@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?
ska.ndal
User
Beiträge: 24
Registriert: Freitag 6. November 2009, 16:02

@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.
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

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.
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.
ska.ndal
User
Beiträge: 24
Registriert: Freitag 6. November 2009, 16:02

@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..
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

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
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

@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.
ska.ndal
User
Beiträge: 24
Registriert: Freitag 6. November 2009, 16:02

danke für die hilfe.. hab mich jetzt entschieden es mit sqlalchemy zu machen

vielen dank.
Antworten