Attribute eines Objekts erhalten?

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
bernd13
User
Beiträge: 26
Registriert: Sonntag 25. Juni 2023, 11:13

Hallo,
ich hatte shcon öfter die Situation dass ich vom Objekt einer Klasse schlicht die von Benutzer definierten Attribute und deren aktuelle Werte will (kurzum die Attribute die man auch imn Quellcode sieht).

Hatte schon verschiedenes versuch was mir Chatgpt da vorgeshclagen hat und bin dabei auch über getAttr() und setAttr() sowie Locals() und Globals() gestoßen.
Aber Chatgpt war nicht wirklich hilfreich dabei nur die Attribute zu erhalten, die in der Klasse definiert wurden.

Viel eher würden da immer alle Attribute des Objekts gedruckt, auch solche wie _init_ und Co. sachen die das Betriebssystem und sonstwer definiert hat.

Kurzum, ich suche rein die im Quellcode definierten Attribute, könnt ihr mir bitte sagen wie ich die abrufen kann ohne jetzt konkret deren Namen zu wissen.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Welche Situation gibt es denn, in der das sinnvoll ist - wenn du die Situation schon öfter hattest?

Edit: Ah, ich erinnere mich. Du warst das Benutzery, das denkt, chatGPT kann programmieren.
Jetzt bin ich noch ein bisschen neugieriger, welche Situation chatGPT wohl für geboten hält, dass man dafür die Antwort auf deine Frage braucht.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bernd13: Das was Du suchst gibt es nicht. Es wird nirgends aufgezeichnet wo ein Attribut gesetzt wird ob in einer Methode in der Klasse oder von ausserhalb und Methoden sind Attribute wie andere auch. Man kann sich nur alle Attribute geben lassen, die zum Zeitpunkt des Abrufs existieren.

Ich wäre auch gespannt auf den Anwendungsfall der da öfter auftritt.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,
Kurzum, ich suche rein die im Quellcode definierten Attribute, könnt ihr mir bitte sagen wie ich die abrufen kann ohne jetzt konkret deren Namen zu wissen.
Du könntest den Quellcode lesen... Dann bist du sicher, was das angeht.

Gruß, noisefloor
bernd13
User
Beiträge: 26
Registriert: Sonntag 25. Juni 2023, 11:13

"Deine IP-Adresse 95.91.221.86 wurde gesperrt, da sie auf der schwarzen Liste steht. Details findest du unter http://www.spamhaus.org/query/bl?ip=95.91.221.86."

Ihr könnts mir auch einfach ins gesicht sagen, und nicht hintenrum mit sarkasmus vorheucheln...

Zum Thema:
Na, ganz banales Beispiel (für Spatzen: ist selbst erfunden und nicht von chatgpt):

Code: Alles auswählen

class Buh:
	a=None
	b=5
	d="Hure"
	
	def __init__(self,c,e,f="Sieben"):
		self.c=c
		self.e=e
		self.f=f

huso=Buh(c=3,e=5,f="Neun")
Manch Menshclein mit shceinbar für hiesige Verhältnis völlig abwegigen ideen kommt vielleicht auf die Idee, vor Allem wenns um Geld geht, dass er nicht die objekte nur als virtuelle Objekte in einem temporären Speicher haben will und die weg sind wenn man das hübsche x oben rechts in der Konsole anklickt.
Sondern die zum aktuellen Zeitpunkt existierenden Objekte vielleicht auch etwas permanenter, namentlich als txt Datei im json format, speichern will.

Heißt für jedes Objekt eine Datei .
Und die Datei enthält eben die aktuellen Variabeln +Werte des Objekts.

Oben im beispiel also bspw. eine Datei huso.txt mit Inhalt

Code: Alles auswählen

{
	a:None,
	b:5,
	c:3,
	d:"Hure",
	e:5,
	f:"Neun"	
}

Viöllig weltfremd, ich weiß, wie kann man nur je auf die Idee kommen, sowas mahcen zu wollen?

jedenfalls Datei erzeugen, json und so ist nicht das Problem.
nur habe ich diverse Objekte verschiedener Klassen und ich hab null Bok, den json Part hardzucoden.

Und jedes Mal wenn ich im Konstruktor oder als class level attribute was Neues hinzufüge,
zig Methoden ändern zu müssen (init methode, irgendwelche methoden die aus den vorliegenden Attributen einen dictionary bauen,
eine save_to_file methose, to_string methode zum drucken des krams, etc.)
Müsste ich überall von Hand das neu erzeugte Attribut mit reinschreiben, hardcoden halt.

Und das ist sehr nervig und für den A...

Drum wärs praktisch, wo python sonst Vieles kann, wenn es mir für ein gegebenes Objekt einfahc sagt welche Attribute es in der Klasse gibt.
Damit ich dann , wenns ein array Tupel oder sosntwas ist, schlicht über die Teile iterieren und getAttr() und Co drauf benutzen kann.

Kurzum, halt nicht jedes einzelne sch.. Attribut in zig Methoden neu reinschreiben muss.

Und bisher kam ich mit locals und göobals nicht wirklich weiter weil da auch viel Msit mit angezwigt ist den eben ich nicht programmiert habe sondern das system, der python interpreter uoder weiß gott wer automatisch zu dem objekt erzeugt hat.
viel müll, der mit unterstrichen anfängt beispielsweise.

dend reck will ich nicht, ich will nur die attribute die ich da auch reingeschrieben habe.
Benutzeravatar
sparrow
User
Beiträge: 4195
Registriert: Freitag 17. April 2009, 10:28

Bei der Wortwahl, unterhalt dich mal weiter mit Bots :)
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zum ersten: deine IP Adresse ist automatisch gesperrt worden, nicht weil hier jemand deinem zweifelhaften Charakter eins auswischen wollte. Passiert mir zb auch mal, wenn ich im Zug bin - weil die Bahn IPs auf Spam-Filtern sind.

Aber da du dir ja direkte Ansprache wünschst: wenn ich hier nochmal Beschimpfungen und mysoginistische Kackscheisse wie “Hure” Lese von dir, und ganz allgemein einen Tonfall, der das Adjektiv zivilisiert vermissen lässt - DANN gibts eine andere Ansage. Krieg dich wieder ein.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bernd13: Was der Anfang des Beitrags soll ist mir nicht klar. Wo siehst Du das und was hat das mit dem Forum hier zu tun?

Für jedes Objekt eine Datei wird problematisch weil die Werte ja selbst wieder Objekte sind. Die können auch Attribute/einen Zustand haben. Und sogar Kreise bilden wenn ein Objekt über mehrere Wege erreichbar ist.

Warum sind die Klassenattribute mit in der huso.txt-Datei? Die gelten ja für alle Exemplare von `Buh` und nicht nur für `huso`. Dann stellt sich die Frage was passieren soll wenn Klassenattribute und Instanzattribute den gleichen Namen haben‽ Bei dem Beispiel gibt es keine Überschneidungen, aber das kann ja passieren.

Man kann nicht jeden Attributwert sinnvoll in einen JSON-Wert umwandeln. Beispielsweise TCP-Verbindungen oder Dateien. Also Sachen die man auch nicht „picklen“ kann. Was auch die Frage aufwirft, warum nicht einfach *das* machen, denn das gibt es ja schon. Mit den Problemen die das mit sich bringt. Wenn es unbedingt JSON sein soll, da gibt's auch ein Modul für: `jsonpickle`.

Nebenbei: Das Beispiel in Deinem Beitrag ist kein JSON.

Üblicherweise macht man so etwas expliziter mit entsprechenden Bibliotheken wie `marshmallow`.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
bernd13
User
Beiträge: 26
Registriert: Sonntag 25. Juni 2023, 11:13

__deets__ hat geschrieben: Sonntag 24. März 2024, 21:52 mysoginistische Kackscheisse
Puh, das ist aber keine zivilisierte Wortwahl ;-)

und meine ip ZUHAUSE sollte wohl auf keinem spamfilter sein, ausser jemand wie mods hat sie da hingesetzt.
drum kann ich das hier, und der vorige beitrag, auch nicht im heimischen internet mit notebook tippen sondern muss es über smartphone und mit mobilem netz schreiben.
insofern DAS hat es mit dem forum zu tun und konktet dem spamhaus quatsch. gehe ich auf den link sagt mir spamhaus selbst:
"bl?ip=95.91.221.86 has no issues"
nur abschicken von antworten geht nicht weil angeblich auf blacklist.
bisschen kaputt, der "spamfilter"...

Vielleicht sollten 5 ANtworten nicht aus "WTf, wozu soll man sowas brauchen?" gefolgt von "Ach, du warst dochd er Kiddie der meinte html wär ne programmiersprache und chatgpt könnte programmieren".
Da kommt die wortwahl von selbst.
Wobei ich wohlgemerkt Niemanden beshcimpft habe, das war nur in deiner Einbildung.
Aber wenn dich die Initialisierung meiner Variabeln stört, kriegen sie halt andere Werte, waren nur Beispiele....

@__blackjack__:
In meinem Fall WEIß ich aber dass die Attribute nur int, float oder String als Werte haben können.
Da wird also kein weiteres Objekt als Wert einer Variabeln vorkommen.
Alles Sachen, die man schön einfach printen und, hoffentlich, auch automatisiert crawlen kann.

Warum sollten die Klassenattribute nicht da drin sein?

Sagen wir ich erzeuge 2 Objekt der Klasse A und B und ändere händisch deren a Attribute auf untershciedliche Werte

Code: Alles auswählen

A.a=5
B.a=7

dann sollte wohl ein Interesse vorhanden sein sich zu speichern welchen a Wert A und B zum betroffenen Zeitpunkt hatten.

Also bisher konnte ich immer mit Code wie

Code: Alles auswählen

        #folder = self.trade_list_name        
        filename1 = os.path.join(folder,f'{self.file_name}.json')
        with open(filename1, 'w') as json_file:
            json.dump(self.to_dict(), json_file, indent=4)
mir die passenden Dateien erzeugen.

Nur will ich halt in der to_dict Methode nicht irgendwie manuell eine dictionary definieren, also meine Zeit nicht verschwenden um sowas wie

Code: Alles auswählen

thisdict = {
  "a": a,
  "b": b,
  "c": c
  }
zu schreiben.
Und entscheide ich mich dann später dass die Klasse noch ein paar weitere Attribute kriegt, dann darf ich in der to_dict methode und in allen weiteren Methoden, wo die attribute der reihe nach abgefragt werden von hand ein

Code: Alles auswählen

self.blabla=blabla
oder ein

Code: Alles auswählen

"blabla":blabla,
reinschreiben.

sowas macht keinen spaß , ist so lächerlich redundant und nervig dass es da doch sicher was einfacheres gibt wie man an die attribute kommt.
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bernd13: Klassenattribute ändert man nicht, denn das wären dann ja globale Variablen. Zudem ändert das ja nichts an dem Problem das Klassenattribute und Instanzattribute gleiche Namen haben können, was bei Deinem Beispiel zu einem Problem führt. Was ist denn dann unter dem jeweiligen Namen in der Datei gespeichert? Das Klassenattribut oder das Instanzattribut?

Dein neues Beispiel macht keinen Sinn wenn das zwei verschiedene Klassen sind. Was ist denn bei ein und der selben Klasse? Warum werden dann in jeder Datei mit Objekten von diesem Typ die gleichen Werte für die Klasse wieder und wieder gespeichert?

Die Antwort bleibt die gleiche: Es gibt da Bibliotheken für und man muss halt mindestens mal “deklarieren“ welche Attribute das jeweilige Objekt haben soll. Für das Umwandeln in ein Wörterbuch würde schon so etwas wie attrs reichen.

Code: Alles auswählen

from attrs import frozen, field, asdict


@frozen
class Buh:
    c = field()
    e = field()
    f = field(default="Sieben")


def main():
    buh = Buh(3, 5, "Neun")
    print(asdict(buh))


if __name__ == "__main__":
    main()
Ausgabe:

Code: Alles auswählen

{'c': 3, 'e': 5, 'f': 'Neun'}
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
bernd13
User
Beiträge: 26
Registriert: Sonntag 25. Juni 2023, 11:13

Okay,wir reden scheinbar aneinander vorbei oder ich verstehe was falsch.

wenn ich sowas wie

Code: Alles auswählen

class help:
a=1
b=2
c=None

def _init_(d,e,f):
self.d=d
self.e=e
self.f=f
dann sollen die objekte der klasse help 6attribute haben :a-f
manche davon a,b,c sind bereit vordefiniert, andere definiere ich bei objekterzeugung.

ich will bei objekterzeugung, das heisst konstruktoraufruf allen attributen werte zuweisen.
einfach weil ich bei objekterzeugung noch nicht weiss welche werte ich letztlich zuweisen werde.

den finalen wert will zeitlich lanfe nach objekterzeugung händisch über help1.c=8 zuweisen.

ein anderes objekt der gleichen klasse soll vll help2.c=5 erhalten.

sind halt unterschiedliche objekte der gleiche klasse mit den selben 6 attributen, die aber selbstredend verschiedene werte haben (sollen, zumindest).

tut das der aktuelle code nicht?

will halt das bei objekteezeugung das objekt schon mal de attribute a,b,c hat (weil später kann man meines wissens nach ja keine neuen attribute hinzufügen)
und erst später dann über help2.a=8 die wirklichen werte zuweise. falls ich mich nicht dafür entscheide help2.c einfach auf Nune stehen zu lassen.
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

Hallo,

a, b und c sind Attribute, die sich _alle_ Instanzen teilen. D.h. wenn du eine Klasse `SomeClass` hast, `foo` und `bar` Instanzen davon sind und du z.B. in `foo` den Wert für a änderst, ändert der sich auch in `bar`. Es gibt dafür auch sinnvolle Anwendungsfälle, aber eher selten.

Nach deiner Beschreibung suchst du eher was wie:

Code: Alles auswählen

class SomeClass:
    def __init__(self, a=1, b=2, c='some text', d=None, e=None, f=None):
        self.a = a
        self.b = b
        self.c = c
        self.d = d
        self.e = e
        self.f = f
Gruß, noisefloor
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@noisefloor: `d`, `e`, und `f` laut Beispiel eher ohne Defaultwert, das heisst die müssen auch eine andere Reihenfolge haben.

Code: Alles auswählen

class Help:
    def _init_(self, d, e, f, a=1, b=2, c=None):
        self.d = d
        self.e = e
        self.f = f
        self.a = a
        self.b = b
        self.c = c


# oder mit `attrs`:


@define
class Help:
    d = field()
    e = field()
    f = field()
    a = field(default=1)
    b = field(default=2)
    c = field(default=None)
@bernd13: Allen Attributen Werte zuweisen ist üblich und sollte man auch machen, aber halt auch wirklich auf dem Objekt und nicht das am Ende manche Attribute vom Objekt kommen und manche von der Klasse. Das ist ein unschöner, schmutziger Hack.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
Benutzeravatar
noisefloor
User
Beiträge: 3856
Registriert: Mittwoch 17. Oktober 2007, 21:40
Wohnort: WW
Kontaktdaten:

`d`, `e`, und `f` laut Beispiel eher ohne Defaultwert, das heisst die müssen auch eine andere Reihenfolge haben.
Ja, richtig. Hatte ich übersehen.

Gruß, noisefloor
bernd13
User
Beiträge: 26
Registriert: Sonntag 25. Juni 2023, 11:13

okay, dann deklarieren wir besser alles im konstruktor.

frage aber verbleibt grundsätzlich:
wenn keine klassenattribute da sind und nur a-f wie im konstruktor definiert (wonöglich werte vll später noch abgeändert über help2.c=12 und so.

wie kriege ich bei gegebenem objekt help2 dessen attribute a-f inklusive aktueller werte (und sei der wert auch None)?

weil locals globals nd co hat ja glaube ich auch von superklassen geerbte attribute, self, und mehr dabei was ich nicht will
Benutzeravatar
__blackjack__
User
Beiträge: 13116
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

@bernd13: Die Frage habe ich zweimal beantwortet. Einmal mit Code-Beispiel. Wobei geerbte Attribute dabei sind. Und ja wohl auch dabei sein sollen, denn ohne macht das wenig Sinn.
„All religions are the same: religion is basically guilt, with different holidays.” — Cathy Ladman
__deets__
User
Beiträge: 14544
Registriert: Mittwoch 14. Oktober 2015, 14:29

bernd13 hat geschrieben: Montag 25. März 2024, 00:27
__deets__ hat geschrieben: Sonntag 24. März 2024, 21:52 mysoginistische Kackscheisse
Puh, das ist aber keine zivilisierte Wortwahl ;-)
Wie man in den Wald hineinruft, so schallt es hinaus.
bernd13 hat geschrieben: Montag 25. März 2024, 00:27 und meine ip ZUHAUSE sollte wohl auf keinem spamfilter sein, ausser jemand wie mods hat sie da hingesetzt.
Da du offensichtlich mit technischen Vorgaengen auf dem Kriegsfuss stehst, und nicht verstehst, wie sowas funktioniert: deine "ip ZUHAUSE" gehoert nicht dir. Die ist von deinem Provider, und der vergibt die auch andauern neu, bei einer Neuinwahl zB. Darum waere es ziemlich dumm, wenn ein Moderator die hier auf eine schwarze Liste setzen wuerde, um dich zu bestrafen. Denn es wuerde ja ueberhaupt nichts nutzen, du bekommst eh wieder eine neue.
bernd13 hat geschrieben: Montag 25. März 2024, 00:27 Vielleicht sollten 5 ANtworten nicht aus "WTf, wozu soll man sowas brauchen?" gefolgt von "Ach, du warst dochd er Kiddie der meinte html wär ne programmiersprache und chatgpt könnte programmieren".
Da kommt die wortwahl von selbst.

Wobei ich wohlgemerkt Niemanden beshcimpft habe, das war nur in deiner Einbildung.
Ich wiederhole mich: wie man in den Wald hineinruft... du hast hier von Anfang an mit scharfen Formulierungen um dich geschmissen. Du bist auch nicht beschimpft worden, sondern dir begegnet genau die Herablassung und der Spott, den du selbst an den Tag legst. Die Opferrolle kann also wieder rueckwaerts durchgefuehrt werden, und dabei die eigene Nase angefasst werden.
bernd13 hat geschrieben: Montag 25. März 2024, 00:27 Aber wenn dich die Initialisierung meiner Variabeln stört, kriegen sie halt andere Werte, waren nur Beispiele....
Dieses Forum wird nicht nur von dir in der trauten Keramikabteilung gelesen. Sondern von vielen anderen Menschen. Wenn du "lustig" sein willst, rede mit ChatGPT, das stoert das nicht. Hilft aber auch nicht so richtig...
bernd13
User
Beiträge: 26
Registriert: Sonntag 25. Juni 2023, 11:13

"deine "ip ZUHAUSE" gehoert nicht dir. Die ist von deinem Provider, und der vergibt die auch andauern neu, bei einer Neuinwahl zB."

Ausser man hat Kabel Internet von Vdafone, so wie ich.

Hätte shcon öfter mal gerne die IP gewechselt aber null Chance.
Antworten