Klassen Name zufällig 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.
Antworten
CompleteBeginner
User
Beiträge: 5
Registriert: Samstag 16. Dezember 2023, 14:50

Guten Tag, liebe Nutzer des Forums,
Ich habe vor kurzem versucht eine Art Spiel auf Python zu programmieren, als kleine Coding-Herausforderung. Meine Version davon benötigt Klassen um am effizientesten zu funktionieren, mein Problem ist allerdings, ich brauche eine unendliche Anzahl an unterschiedlichen Objekten, da diese zufällig generiert werden sollen.
Ich habe mir bereits Gedanken darüber gemacht es nach diesem Prinzip laufen zu lassen:

Code: Alles auswählen

list = []
class Object:
  def __init__(self):
    pass
food = Object()
times_to_take_food = 10
for i in range(times_to_take_food):
  list.append(Food)
Wichtig für mich allerdings ist, ein jedes Mal neues Objekt zu erstellen, das Problem dabei ist aber, dass ich nicht weiß, wie das funktioniert, ich weiß natürlich, wie man beispielsweise eine zufällige Zahl (integer) generiert (

Code: Alles auswählen

random.randint
), allerdings fehlt mir der Code, das ganze auch auf Objekte anzuwenden. Hier ist ein Code um zu erläutern, was ich damit meine:

Code: Alles auswählen

list = []
class Object:
  def __init__(self):
    pass
 random_object_needed = 1000_000
for i in range(random_object_needed):
  random_object = "x"  # Your code for a random object 
  list.append(random_object)
  print(list)
  
Output:
*Jedes Objekt (1000 000 Stück in dem Fall) welches auf diese Weise kreiert wurde*

Natürlich würde ich mich über eine effiziente Antwort auf meine Frage freuen, aber mir ist im Grunde nur wichtig, dass es funktioniert, am besten so wie ich es beschrieben habe. Aber ich gehe einmal davon aus, dass noch einige Zeilen dazugecodet werden müssen, was auch kein Problem ist

Vielen Dank für eure Antworten!
Benutzeravatar
/me
User
Beiträge: 3556
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

Code: Alles auswählen

random_object = "x"  # Your code for a random object 
Dafür suchst du passenden Code?

Den hast du doch in deinem ersten Beispiel:

Code: Alles auswählen

food = Object()
Der einzige Unterschied zwischen beiden Versionen: In deinem ersten Codebeispiel erstellst du die Instanz von Object vor der Schleife und steckst die dann 10mal in eine Liste. Die Liste enthält also mehrmals die gleiche Instanz. Im zweiten Beispiel hast du die Instanzerzeugung in der Schleife und dadurch ist jeder Eintrag in der Liste individuell.

Anmerkung zum Code ansonsten:
  1. Sowohl `Object` als auch `list` sind selbst für ein Beispiel sehr unglücklich gewählte Namen.
  2. Die Einrückung sollte 4 Leerzeichen pro Ebene betragen
CompleteBeginner
User
Beiträge: 5
Registriert: Samstag 16. Dezember 2023, 14:50

Danke, für deine Antwort.
"list" und "object" habe ich nur als schlechte Beispiele genommen, genau wie die Schleife für einmal 10 und danach 1000 000, ja, allerdings beantwortet das nicht richtig meine Frage. Du hast geschrieben, ich soll es so, wie im ersten Beispiel machen, allerdings suche ich nch einer Möglichkeit, jedes Objekt unterschiedlich und nacheifern Zufälligen Kombination aus Zeichen zu benennen. Wie mir scheint, ist das aber untypisch für Python, sehe ich das richtig?

Unabhängig ob das stimmt, oder nicht, suche ich dennoch nach einer Lösung für mein Problem.

Ich habe nun in meinem zweiten Beispiel nicht ausdrücklich darauf hingewiesen, dass ich mit x nur immer meine Variable neu definieren möchte, ein Beispiel für Zahlen wäre

Code: Alles auswählen

random.randint()
wie ich schon erwähnt habe. Ich suche eben allerdings nach einer Möglichkeit, dasselbe für ein Objekt zu machen.

Code: Alles auswählen

random.randname()
wäre da das passende Gegenstück nach dieser Logik; also im Code

Code: Alles auswählen

x = random.randname()
. Allerdings bin ich mir ziemlich sicher, dass das Random-Module diese Funktion nicht beinhaltet, darum suche ich hier in diesem Forum.

Unabhängig, ob das ganze nun möglich ist oder nicht, würde ich es gerne erfahren.

Entschuldigung für die Verwirrung, schönen Abend noch und vielen Dank für die Antwort nochmals!
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Wie willst du denn auf deine zufällig benannten Objekte zugreifen? Wenn du nicht auch gleich Code erzeugst, der diese Namen beinhaltet, hast du davon ja nix.

Es würde mehr zur Lösung beitragen, wenn du mal dein eigentliches Problem darstellst. Statt auf dich auf eine unverstandene, vermeintliche Lösung zu kaprizieren.
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@CompleteBeginner: Was soll denn das bedeuten das da ein zufälliges Objekt erstellt werden soll? Zu einem Objekt das man erstellen will, braucht man doch eine konkrete Klasse. Wie sollte die denn zufällig erstellt werden?

/me hat nicht geschrieben Du sollst das wie im *ersten* Beispiel machen, denn dort wird 10 mal *das selbe* Objekt in die Liste gesteckt, was man in der Regel nicht möchte. Sofern man mit der Klasse keinen Wert-Typ implementiert hat, also einen Typ dessen Wert unveränderbar ist.

Mit dem benennen wird die Frage noch unverständlicher weil die Objekte in einer Liste gar keine Namen haben sondern eine Indexposition. Objekte haben in der Regel keine Namen. Ausnahmen sind eigentlich nur Module, Funktionen und Methoden die mit ``def`` erstellt wurden und Klassen, die ein `__name__`-Attribut haben. Ansonsten kann man Objekte an einen oder mehrere Namen binden — oder eben auch an gar keinen, wenn man sie in eine Datenstruktur wie Listen, Wörterbücher, Mengen, und so weiter steckt. Es macht keinen Sinn ein Objekt an zufällige Namen zu binden. Generell nicht einmal programmatisch an nicht-zufällige Namen, denn dann kommt ja sofort die bereits angesprochene Frage wie *da* dann wieder drauf zugreift. Du musst um so ein Objekt im Programm benutzen zu können dann vorher schon den zufälligen wissen um ihn in den Quelltext tippen zu können.

Kann es sein, dass Du keine Liste verwenden willst, sondern ein Wörterbuch (`dict`) das Zeichenketten mit zufälligen Zeichenfolgen auf Deine Objekte abbildet‽

Eine Funktion zufällige Zeichenketten zu erstellen gibt es nicht fertig, die kann man sich aber leicht selber schreiben. Zum Beispiel in dem man mit `random.choice()` wiederholt aus einer Sequenz von Zeichen auswählt, und die mit der `join()`-Methode auf Zeichenketten zu einer längeren Zeichenkette zusammensetzt. Als Auswahlmenge kann eventuell eine der Konstanten aus dem `string`-Modul nützlich sein.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
CompleteBeginner
User
Beiträge: 5
Registriert: Samstag 16. Dezember 2023, 14:50

Vielen Dank für die Antwort @__blackjack__!

Ich glaub ich verstehe, worauf du hinaus möchtest. Es scheint sich nicht zu lohnen Ojekte Namen zu geben, es reichen Indexe in einer Liste, richtig?

Ich akzeptiere das, aber mich würde trotzdem interessieren, ob so etwas möglich wäre, zB weil man diese in einer Variable speichern könnte, anstelle eines Indexes in einer Liste, auf diese Weise dürfte es auch möglich sein, Fehler durch Verschiebungen in Listen vorzubeugen...


Um damit auf @__deets__ Antwort zurückzukommen, besitze ich leider keine richtige Version eines Codes, in welchem so etwas unbedingt benötigt wird. Stattdessen kann dieses genausogut auch mit einem Index in einer Liste gehandhabt werden, wie mir jetzt auffällt.
Wie jedoch erwähnt, würde es mich trotzdem interessieren, ob so etwas ebenfalls möglich wäre, dabei ist dann der Grund, warum das der Fall ist, nicht relevant, lediglich das Wissen, es auch auf eine solche Art Lösen zu können, könnte in gewissen Situationen ein Vorteil sein, womöglich...

Und noch zurück zu @__blackjack__:
Am Ende hast du geschrieben, ich könnte einen "dict" (ich gehe davon aus, das kommt von dictionary) suchen, allerdings kann ich aus dem, was du oben dazu geschrieben hast nicht exakt schließen, wozu dieser verwendet wird. Wäre es eventuell möglich einen Code mit einem Beispiel bereitzustellen, damit auch ich-ein kompletter Beginner-mitkommt?

Der letzte Absatz, scheint mir, beantwortet meine ursprüngliche Frage wohl am besten, also werde ich mich an diese Wenden, sollte ich das ganze nun benötigen.
Ich weiß allerdings noch nicht genau, wie das dann funktioniert, zB:

Code: Alles auswählen

class Character:
  def __init__(self):
    pass
symbols = ["a", "b", "c", "d"]  #...
for i in  range(1000_000):
  y = ""
  for i in range(1000):  # größere Anzahl geringere Verdopplungswahrscheinlichkeit, sowie aber auch, Effizienz nehme ich an
    x = random.choice()
    y.join(x)
  y = Character()
Was ich mir allerdings denke ist, dass y in dem Fall lediglich ein String ist, was bedeutet, dass ich diesen noch zu einem Objekt verändern muss, was meine ursprüngliche Frage war. Sollte "dict", also

Code: Alles auswählen

dict(y) = Character
Die Lösung sein, so werde ich diese künftig nutzen.
Vielen Dank für die netten Antworten nocheinmal und schönen restlichen Tag euch!
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

@CompleteBeginner: Arbeite das offizielle Python Tutorial durch. Es nützt in meinen Augen nichts, irgendwelche speziellen Fragen ohne fachliche Notwendigkeit zu stellen und sich an einem theoretischen Konstrukt abzuarbeiten.
Und das Durcharbeiten des Tutorials würde dir auch Kenntnisse über die Datenstrukturen in Python vermitteln. Und die sind für die Anwendung von Python elementar.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

CompleteBeginner hat geschrieben: Sonntag 17. Dezember 2023, 02:21 Um damit auf @__deets__ Antwort zurückzukommen, besitze ich leider keine richtige Version eines Codes, in welchem so etwas unbedingt benötigt wird. Stattdessen kann dieses genausogut auch mit einem Index in einer Liste gehandhabt werden, wie mir jetzt auffällt.
Wie jedoch erwähnt, würde es mich trotzdem interessieren, ob so etwas ebenfalls möglich wäre, dabei ist dann der Grund, warum das der Fall ist, nicht relevant, lediglich das Wissen, es auch auf eine solche Art Lösen zu können, könnte in gewissen Situationen ein Vorteil sein, womöglich...
Ist es nicht. Der Python-Interpreter ist aussergewoehnlich flexibel, und erlaubt tiefe Eingriffe. Und auf der Ebene liesse sich da irgendwas in der Art, wie du es hier beschreibst, machen. Aber du bist hier wie ein Fahranfaenger, der noch vorm Gurtanlegen bei der ersten Fahrstunde fragt, ob er beim Drift um den Eiffelturm gleichzeitig das Motor-Tuning mit einem Programmieradapter im Motorraum aendern kann. Ein Manoever, das vielleicht irgendwie irgendwann unter ganz bestimmten Umstaenden moeglich und noetig ist - aber selbst fuer Profis ungewoehnlich, und erst Recht weit jenseits deiner Kenntnisse ist. Und damit unrealistisch, dass du da jemals ankommst. Ohne (!), dass das einen ernsthaften Einfluss auf die Moeglichkeiten zu programmieren (oder Auto zu fahren) haette.

Es geht hier also nicht um geheimes Wissen, dass dir vorenthalten werden soll. Es ist einfach die falsche Denkweise.

Und genauso wie der Fahrlerer nicht in der ersten Fahrstunden dir eine Lektion im Driften gibt, weil das Risiko fuer einen katastrophalen Ausgang gross ist, mache ich (und die meisten anderen hier) das auch nicht. Weil es lediglich die Gefahr birgt, dass du dir falsche Muster angewoehnst, die es dann muehselig zu loeschen gilt. sparrow hat es schon gesagt: arbeite das normale Tutorial durch, und du bist gut geruestet. Man arbeitet mit Datenstrukturen (Listen oder Woerterbuechern sind die gebrauechlichsten).
CompleteBeginner
User
Beiträge: 5
Registriert: Samstag 16. Dezember 2023, 14:50

Ihr habt beide Recht, @__deets__ und @sparrow, ich höre das öfters, dass ich immer mehr wissen möcht als ich eigentlich benötige, allerdings ist mein Gehirn mehr oder weniger so aufgebaut, zu einem Thema so viel wie möglich zu wissen, um es zu verstehen, wie sich schon das ein, oder andere Mal erwies. Solltet ihr mir nun keine Antwort geben wollen, so akzeptiere ich das natürlich, allerdings hätte dennoch gern eine Antwort, egal wie stur das nun sein mag. Laut @__blackjack__ gibt es eine Möglichkeit, ein "dict" zu erstellen, was meine Frage ein wenig verändert hat:
  • Wie ein dictionary funktioniert und was es macht
  • Wie ich ein solches erstelle
So wie ich das sehe, sind das Fragen, dessen Antworten ich deutlich häufiger tatsächlich anwenden könnte und mir demnach auch etwas bringen, außerdem denke ich, ein dictionary könnte auch meiner ursprünglichen Frage weiterhelfen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
CompleteBeginner hat geschrieben: Sonntag 17. Dezember 2023, 14:44
  • Wie ein dictionary funktioniert und was es macht
  • Wie ich ein solches erstelle
Was wieder zu Antwort von @sparrow führt: arbeite das Python-Tutorial durch. Ein Dictionary ist eine _der_ grundlegenden Datenstrukturen in Python. Braucht man immer (und, BTW, wird auch intern innerhalb vom Python genutzt).

Wenn du den Umgang mit Dicts nicht beherrschst brauchst du dir über Klassen und deren Instanzen zum jetzigen Zeitpunkt ganz sicher noch keine Gedanken machen - weil das so ca. 5-10 Schritte zu früh ist.

Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13117
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@CompleteBeginner: Wozu sollen denn 1.000 Zeichen lange zufällige ”Namen” gut sein? Die wird man sich als Programmierer sicher nicht merken und irgendwann mal manuell eintippen, und auch wenn man als Programmierer mehrere solche Zeichenketten zu sehen bekommt, wird man die sicher nicht im Kopf konkreten Objekten zuordnen können.

Eine ”Identität” haben Objekte schon von Haus aus. Das gehört zur Definition von Objekten in der objektorientierten Programmierung (OOP), das Objekte die den gleichen Wert repräsentieren trotzdem noch über ihre Identität unterscheidbar sind, Die Identität eines Objekts lässt sich mit Hilfe der `id()`-Funktion auch als ganze Zahl ausdrücken, was aber praktisch kaum verwendet wird. Hauptsächlich bei der Fehlersuche, oder um das mit der Identität zu erklären. Ansonsten braucht man diese Funktion und diese Zahl im problemlösenden Teil von Programmen so gut wie nie.

Fehler die durch Verschiebungen in Listen entstehen können, vermeidet man in dem man normalerweise a) keine Indexwerte in Listen verwendet, dann ist es egal wenn sich etwas in der Liste verschiebt, und b) keine Elemente aus mitten aus Listen löscht oder hinzufügt, dann verschiebt sich da auch nichts.

`dict` kommt in der Tat von „dictionary“ und ist ein eingebauter Grunddatentyp in Python. Der wird neben Listen in jedem Grundlagentutorial behandelt, weil diese beiden Typen wirklich die absoluten Grundlagen bilden was Datenstrukturen angeht. Also einen Sequenztyp wo man Werte speichern kann die eine Reihenfolge haben, und einen Abbildungstyp wo man Werte auf andere Werte abbilden kann. Zum Beispiel Zeichenketten, die einen Namen enthalten, auf `Character`-Objekte.

Konkret ein Wörterbuch erstellen das eine Million zufällige Namen auf eine Million `Character`-Objekte abbildet, würde man nicht durch zufälliges erstellen von Namen lösen können, denn dabei könnte ja zufällig auch mal der gleiche Name bei herauskommen, der schon für ein Objekt vorher erzeugt wurde. Für diesen Fall würde man sich aus einer ausreichend grossen Menge von Namen zufällig eine Million auswählen lassen. Dafür reichen auch fünf Buchstaben aus "a" bis "z" aus. Damit könnte man fast 12 Millionen eindeutige Namen der Länge fünf bilden.

Der Code dazu könnte so aussehen:

Code: Alles auswählen

#!/usr/bin/env python3
import random
from string import ascii_lowercase


class Character:
    pass


def create_name(number, length):
    letters = []
    while number:
        number, remainder = divmod(number, len(ascii_lowercase))
        letters.append(ascii_lowercase[remainder])

    return "".join(reversed(letters)).rjust(length, ascii_lowercase[0])


def iter_random_names(length, count):
    return (
        create_name(number, length)
        for number in random.sample(
            range(len(ascii_lowercase) ** length), count
        )
    )


def main():
    character_count = 1_000_000
    name_length = 5

    name_to_character = {
        name: Character()
        for name in iter_random_names(name_length, character_count)
    }
    assert len(name_to_character) == character_count

    for number, (name, character) in enumerate(name_to_character.items(), 1):
        print(f"{number:>3}  {name}  {character}")
        if number == 20:
            break


if __name__ == "__main__":
    main()
Die Ausgabe der ersten 20 Name/Character-Paare:

Code: Alles auswählen

  1  zdtis  <__main__.Character object at 0x7f8782813b80>
  2  jehht  <__main__.Character object at 0x7f8782813bb0>
  3  gghmb  <__main__.Character object at 0x7f878284cdf0>
  4  lnfam  <__main__.Character object at 0x7f878284c7f0>
  5  dnqos  <__main__.Character object at 0x7f878284c670>
  6  czabk  <__main__.Character object at 0x7f8781ea4ac0>
  7  sbfzp  <__main__.Character object at 0x7f8781ea52d0>
  8  wsrct  <__main__.Character object at 0x7f8781ea7280>
  9  fgfxj  <__main__.Character object at 0x7f8781ea72e0>
 10  nxekd  <__main__.Character object at 0x7f8781ea7310>
 11  ixlrm  <__main__.Character object at 0x7f8781ea7f10>
 12  eekkc  <__main__.Character object at 0x7f8781ea7d60>
 13  iljbs  <__main__.Character object at 0x7f8781ea52a0>
 14  chsxm  <__main__.Character object at 0x7f8781ea5270>
 15  fjvfl  <__main__.Character object at 0x7f8781ea7c40>
 16  gxfbm  <__main__.Character object at 0x7f8781ea5210>
 17  rpckh  <__main__.Character object at 0x7f8781ea5060>
 18  vxpte  <__main__.Character object at 0x7f8781ea5030>
 19  nzpph  <__main__.Character object at 0x7f8781ea5000>
 20  jnwmk  <__main__.Character object at 0x7f8781ea4fd0>
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
CompleteBeginner
User
Beiträge: 5
Registriert: Samstag 16. Dezember 2023, 14:50

Dankeschön, @__blackjack__, das hilft mir sehr weiter, ich denke ich habe nun alles, was ich brauche!^^
Benutzeravatar
Kebap
User
Beiträge: 687
Registriert: Dienstag 15. November 2011, 14:20
Wohnort: Dortmund

Was du also alles brauchst, um eigentlich was genau damit zu tun?
MorgenGrauen: 1 Welt, 8 Rassen, 13 Gilden, >250 Abenteuer, >5000 Waffen & Rüstungen,
>7000 NPC, >16000 Räume, >200 freiwillige Programmierer, nur Text, viel Spaß, seit 1992.
Antworten