Merkwürdiges Struct-ähnliches Element

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
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Verzeihung, mir ist einfach kein besserer Titel dazu eingefallen.
Heute bin ich etwas merkwürdigen begegnet und kann nicht erklären wieso das erlaubt ist, funktioniert und ob es irgendwie sinnvoll ist.
Aktiv in Verwendung hab ich das gesehen, fand es da aber wenig sinnvoll.

Code: Alles auswählen

def a(): pass
a.p = True
p taucht dann im Namensraum von a auf(dir(a)).
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Funktionen sind nicht anderes als Objekte, daher kannst du mit ihnen alles machen, was du mit anderen Objekten auch machst. "p" befindet sich auch nicht im Namensraum von "a", das ist etwas anderes, sondern ist ein ganz normales Attribut.
Das Leben ist wie ein Tennisball.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Irgendwie verhälts sich wie ein Funktionszeiger oder warum gibt er eine Adresse da zurück?

Code: Alles auswählen

def n():
    print(n.d)

n.d = 1
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
Sirius3
User
Beiträge: 17749
Registriert: Sonntag 21. Oktober 2012, 17:20

@darktrym: ich verstehe nicht, was Du mit „Funktionszeiger“ meinst. »n« ist innerhalb von »n ein ganz normales globales Objekt.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Was heißt denn hier normal?
Außerhalb ist es eine "normale" Variable innerhalb ein "normaler" Verweis.
Gibts ein Begriff/Referenz wo man sich drüber informieren kann wieso das so ist?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: `n` ist sowohl ausserhalb als auch innerhalb der Funktion ein Name der auf Modulebene definiert ist.

Was Du da gerade mit Funktionszeiger, Verweis, und Adresse sagen willst verstehe ich nicht. Das gibt es in Python nicht. In Python gibt es Namen und Werte, und *alles* was man an einen Namen binden kann, also *jeder* Wert, *ausnahmslos*, ist ein Objekt. Und bei den meisten Objekten kann man zur Laufzeit neue Attribute hinzufügen.

Edit: Und das heisst in diesem Zusammenhang „normal”, denn das sollte man von Objekten in Python eigentlich erwarten und nicht überrascht sein.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Habs jetzt gefunden, das da nennt sich Funktionsattribute beschrieben in PEP232.
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Ich denke Du siehst das immer noch als etwas zu spezielles an statt einfach als ganz normale Attribute auf einem Objekt. Das PEP war nur nötig weil Funktionsobjekte vorher kein `__dict__`-Attribut hatten.
Benutzeravatar
darktrym
User
Beiträge: 784
Registriert: Freitag 24. April 2009, 09:26

Funktioniert das auch mit was anderem außer Funktionen und Klassen/Instanzen?
Für mich ist das nicht schlüssig warum eine Funktion ein Objekt sein muss wenn alles andere das nicht ist.
Bei Klassen/Instanzen kann ich der Idee was abgewinnen aber Funktionen?

Wenn ADT wie Listen und Wörterbücher Attribute und Methoden besitzen und somit zu Objekten macht, wieso funktioniert das nicht bei denen?
„gcc finds bugs in Linux, NetBSD finds bugs in gcc.“[Michael Dexter, Systems 2008]
Bitbucket, Github
BlackJack

@darktrym: Was meinst Du mit alles andere wäre kein Objekt? Nochmal: *Alles* was man an einen Namen binden kann ist ein Objekt in Python.

Die Typen die Du aufgezählt hast sind alle in C programmiert und wenn man einen Typ in C programmiert, muss man explizit dafür sorgen dass Exemplare davon ein `__dict__` haben und damit beliebige Attribute zur Laufzeit gesetzt werden können. Umgekehrt geht es auch: man kann bei in Python implementierten Typen verhindern das Exemplare ein `__dict__` haben, in dem man die Attribute mit `__slots__` festlegt.
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

darktrym hat geschrieben:Funktioniert das auch mit was anderem außer Funktionen und Klassen/Instanzen?
Für mich ist das nicht schlüssig warum eine Funktion ein Objekt sein muss wenn alles andere das nicht ist.
Bei Klassen/Instanzen kann ich der Idee was abgewinnen aber Funktionen?
Dann ist da doch kein Problem, weil Funktionen sind Instanzen der Klasse ``function``. Und dass sie Objekte sind, ist nützlich, damit kannst du mit Funktionen tolle Sachen machen. Sie zum Beispiel als Parameter an andere Funktionen übergeben. Oder sie an Namen binden.
darktrym hat geschrieben:Wenn ADT wie Listen und Wörterbücher Attribute und Methoden besitzen und somit zu Objekten macht, wieso funktioniert das nicht bei denen?
Weil es dort speziell verboten wurde, an diese Attribute hinzuzufügen. Die Idee dahinter war zu verbieten dass irgendwelche Libraries die "Basissprache" soweit verändern, dass ggf andere Libraries dann nicht mehr funktionieren weil etwa jemand bei Listen die ``append``-Methode durch irgendwas anderes ersetzt hat.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Antworten