Hallo,
ich stoße in den wxPython Docs immer wieder auf Ausdrücke, die ich mir nicht erklären kann. So z. B.:
wxSizerItem* Add(wxWindow* window, const wxSizerFlags& flags)
Was ich verstehe:
Die wxSizer-Methode gibt ein wxSizerItem zurück und verlangt als Übergabe ein wxWindow und ein wxSizerFlag (oder mehrere).
Was ich nicht verstehe:
Was bedeutet das * hinter dem wxSizerItem und dem wxWindow?
Was bedeutet der Begriff 'const' vor wxSizerFlags und das & hinter wxSizerFlags?
Meistens steht vor einem Parameter als Typbezeichnung auch ein 'int' oder 'bool'. Weiß leider nicht wirklich, was das bedeuten soll...?
Und zuletzt noch das:
wxWindow * GetContainingWindow() const
Ein wxWindow Objekt wird zurückgegeben, ok. Aber das 'const' am Ende, warum steht das da??
Wäre echt super klasse, wenn ich da ein wenig Licht reinbekäme...
Danke schon mal!!
Gruß
mutetella
Erklärung Methoden-/Funktionsbeschreibung...??
Das blaue da sind Signaturen der Sprache C++ und nicht von Python. Vielleicht wurden sie einfach aus Bequemlichkeit in der Python-Dokumentation drin gelassen. Kann ich nicht sagen.
Der "*" hinter "wxSizerItem" sagt, dass hier ein Zeiger auf so eine Struktur zurückgeben wird. In Python geht das gar nicht anders, das kannst du also igorieren bzw. als Normalfall ansehen.
Das "&" definiert, dass da etwas als Referenz übergeben wird, ein Konzept, das Python nicht kennt. Bei "Add" würde mich auch wundern, warum dieser Befehl die übergebene Variable ändern könnten sollte - das muss jemand erklären, der C++ fließend spricht.
"int" sind Integers, Ganzzahlen. In Python gibt es auch "int". Zu beachten ist, dass in C++ die Zahlen eine Obergrenze haben, entweder liegt die bei 2 Millarden-etwas (2^31-1) oder 2^63-1, je nah Plattform. "bool" ist ein Wahrheitswert, Boolscher Wert, also True oder False. Gibt es ebenfalls auch in Python.
Stefan
Der "*" hinter "wxSizerItem" sagt, dass hier ein Zeiger auf so eine Struktur zurückgeben wird. In Python geht das gar nicht anders, das kannst du also igorieren bzw. als Normalfall ansehen.
Das "&" definiert, dass da etwas als Referenz übergeben wird, ein Konzept, das Python nicht kennt. Bei "Add" würde mich auch wundern, warum dieser Befehl die übergebene Variable ändern könnten sollte - das muss jemand erklären, der C++ fließend spricht.
"int" sind Integers, Ganzzahlen. In Python gibt es auch "int". Zu beachten ist, dass in C++ die Zahlen eine Obergrenze haben, entweder liegt die bei 2 Millarden-etwas (2^31-1) oder 2^63-1, je nah Plattform. "bool" ist ein Wahrheitswert, Boolscher Wert, also True oder False. Gibt es ebenfalls auch in Python.
Stefan
Wow.... das ging ja mal schnell....
Vielen Dank für Deine Erklärung, das hilft mir schon mal sehr.
Könntest Du mir noch kurz erklären, was neben int und bool der Typ const bedeutet und warum dieser Typ so ohne erkennbaren Bezug manchmal am Ende einer Funktionsbeschreibung (also noch hinter den Klammern) steht.
Und sehe ich das richtig, dass ein void als Übergabeangabe bedeutet, dass nichts übergeben wird?
Danke!!
mutetella
Vielen Dank für Deine Erklärung, das hilft mir schon mal sehr.
Könntest Du mir noch kurz erklären, was neben int und bool der Typ const bedeutet und warum dieser Typ so ohne erkennbaren Bezug manchmal am Ende einer Funktionsbeschreibung (also noch hinter den Klammern) steht.
Und sehe ich das richtig, dass ein void als Übergabeangabe bedeutet, dass nichts übergeben wird?
Danke!!
mutetella
@sma: "Add" soll die Variable nicht verändern, und könnte es auch gar nicht, da die Referenz als konstant deklariert ist ("const T&"). Diese Art der Übergabe dient nur dazu, "pass by value" und die damit einhergehende vollständige Kopie zu vermeiden, ohne sich die Komplexität von Zeiger einzuhandeln.
"const &T" ist quasi eine Art opaquer Zeiger auf ein unveränderbares Objekt. Im Allgemeinen nutzt man diese Art der Übergabe, um Objekte, die eigentlich "Werttypen" und keine unabhngig lebenden Objekte repräsentieren (e.g. Zeichenketten) zu übergeben.
"const &T" ist quasi eine Art opaquer Zeiger auf ein unveränderbares Objekt. Im Allgemeinen nutzt man diese Art der Übergabe, um Objekte, die eigentlich "Werttypen" und keine unabhngig lebenden Objekte repräsentieren (e.g. Zeichenketten) zu übergeben.
void als Parameter ist AFAIK in C++ nicht üblich. Ein "void *" wäre ein Zeiger auf einen nackten (bedeutungslosen) Speicherbereich. Sowas kann als Parametertyp vorkommen. Ein "void" als Rückgabetyp (vor dem Funktionsnamen) sagt, dass die Funktion nix zurückliefert. Sowas ist in Python nicht möglich. Hier wird stattdessen das Objekt "None" zurückgegeben, was für nix steht. Const zusammen mit "&" sagt, dass da eine Variable in die Funktion hineingereicht wird, ihr Wert aber nicht von der Funktion verändert wird. Das const am Ende einer Funktion gibt es AFAIK nur bei Methoden und sagt, dass diese Methode keinen Seiteneffekt auf die member variables (wie heißt das denn in C++ auf Deutsch?) hat, also die Attribute der Objekte würde man in Python sagen.
Stefan
Stefan
Für Flags? Das erschient mir ungewöhnlich. Das werden doch wohl nur ein paar bits in einem int als Bitfield sein. Ich weiß schon, warum ich C++ nicht mag :)lunar hat geschrieben:Diese Art der Übergabe dient nur dazu, "pass by value" und die damit einhergehende vollständige Kopie zu vermeiden
Stefan
Was ist denn dann eigentlich eine Übergabe als const char*? Kommt das aufs gleiche raus?lunar hat geschrieben:@sma: "Add" soll die Variable nicht verändern, und könnte es auch gar nicht, da die Referenz als konstant deklariert ist ("const T&"). Diese Art der Übergabe dient nur dazu, "pass by value" und die damit einhergehende vollständige Kopie zu vermeiden, ohne sich die Komplexität von Zeiger einzuhandeln.
@me: Einer konstanten Referenz "const T&" kann man nichts zuweisen, einem Zeiger auf ein konstantes Objekt "const T*" dagegen schon. Ein konstanter Zeiger auf ein konstantes Objekt "const T const*" wäre in etwas dasselbe wie eine konstante Referenz "const T&".
@lunar
void SetMinSize(const wxSize& size)
Das ist die Erklärung dafür, wie ich an ein wxSizer Objekt den Wert für die Mindestgröße übergebe.
Weshalb steht hier const wxSize&? Wenn es eine konstante, also unveränderbare Referenz ist, wie kann ich dieser etwas zuweisen?
void SetMinSize(const wxSize& size)
Das ist die Erklärung dafür, wie ich an ein wxSizer Objekt den Wert für die Mindestgröße übergebe.
Weshalb steht hier const wxSize&? Wenn es eine konstante, also unveränderbare Referenz ist, wie kann ich dieser etwas zuweisen?
Es gibt keine Pythondoku, es ist lediglich vermerkt wenn sich etwas anders verhält, in wxPython bzw. wxPerlsma hat geschrieben:Das blaue da sind Signaturen der Sprache C++ und nicht von Python. Vielleicht wurden sie einfach aus Bequemlichkeit in der Python-Dokumentation drin gelassen. Kann ich nicht sagen.
Es gibt die Class reference und ein wxPython API Viele bemängeln dass, ich mags so

the more they change the more they stay the same
@mutetella: Du hast doch dies Funktion gar nicht implementiert, die gibt es doch schon. Die Funktion *selbst* verändert an dem `wxSize` auf C++-Ebene nichts. Du übergibst da einfach ein `wx.Size`-Exemplar in Python und gut ist.
@BlackJack
Verstehe ich jetzt nicht wirklich... Dass ich da ein wxSize Objekt übergebe ist mir schon klar, nur die Beschreibung der Funktion, explizit die Bedeutung von const wxSize& verstehe ich nicht. Laut lunar bedeutet die Schreibweise, dass es sich bei size um eine konstante Referenz handelt. Aber size ist doch nicht veränderbar, ich ändere es doch, indem ich einen beliebigen Wert eintrage. Bin ich total auf dem Holzweg oder werde ich das nicht kapieren, weil ich C nicht kann?
@lunar
Aber size ist doch ein Parameter für die wxSizer-Methode SetMinSize(). Dem muss ich doch was zuweisen....
Verstehe ich jetzt nicht wirklich... Dass ich da ein wxSize Objekt übergebe ist mir schon klar, nur die Beschreibung der Funktion, explizit die Bedeutung von const wxSize& verstehe ich nicht. Laut lunar bedeutet die Schreibweise, dass es sich bei size um eine konstante Referenz handelt. Aber size ist doch nicht veränderbar, ich ändere es doch, indem ich einen beliebigen Wert eintrage. Bin ich total auf dem Holzweg oder werde ich das nicht kapieren, weil ich C nicht kann?
@lunar
Aber size ist doch ein Parameter für die wxSizer-Methode SetMinSize(). Dem muss ich doch was zuweisen....

- cofi
- Python-Forum Veteran
- Beiträge: 4432
- Registriert: Sonntag 30. März 2008, 04:16
- Wohnort: RGFybXN0YWR0
Nein, du uebergibst einfach `size`. Das `const` ist ein (vom Compiler ueberprueftes) Versprechen an dem uebergebenen Objekt nichts zu aendern.
Die Details brauchen dich doch gar nicht zu interessieren, wenn du von Python aus die Library bedienst, du musst dich nur an den Typen orientieren.
Die Details brauchen dich doch gar nicht zu interessieren, wenn du von Python aus die Library bedienst, du musst dich nur an den Typen orientieren.
Michael Markert ❖ PEP 8 Übersetzung ❖ Tutorial Übersetzung (3.x) ⇒ Online-Version (Python 3.3) ❖ Deutscher Python-Insider ❖ Projekte
@mutetella: `const wxSize&` sagt Dir, dass es eine Referenz vom Typ `wxSize` (in C++) sein muss und verspricht Dir, dass die Methode an dem Objekt nichts ändert (`const`). Wenn Du da also ein `wx.Size` mit Höhe 23 und Breite 42 übergibst, dann kannst Du sicher sein, dass die Methode diese Grössen nicht ändert. Die sind nach dem Aufruf noch genau so.
*Du* kannst da durch den Aufruf natürlich was zuweisen. Eine Variable zu deklarieren der man *nie*, also nichtmal zum Initialisieren etwas zuweisen kann, wäre ja nun auch ein ganz klein wenig sinnlos, oder!?
Ansonsten musst Du wohl wirklich ein wenig C++ lernen um C++-Funktions- und Methodensignaturen lesen zu können. Andererseits sollte das meiste benutzbar sein, indem Du einfach die ganzen "qualifier" ignorierst und nur auf den Typ schaust. Welcher Typ dafür in Python verwendet werden muss, ist in der Regel recht einfach abzuleiten. `wxIrgendwas` ist bei der Python-Anbindung `wx.Irgendwas`.
*Du* kannst da durch den Aufruf natürlich was zuweisen. Eine Variable zu deklarieren der man *nie*, also nichtmal zum Initialisieren etwas zuweisen kann, wäre ja nun auch ein ganz klein wenig sinnlos, oder!?
Ansonsten musst Du wohl wirklich ein wenig C++ lernen um C++-Funktions- und Methodensignaturen lesen zu können. Andererseits sollte das meiste benutzbar sein, indem Du einfach die ganzen "qualifier" ignorierst und nur auf den Typ schaust. Welcher Typ dafür in Python verwendet werden muss, ist in der Regel recht einfach abzuleiten. `wxIrgendwas` ist bei der Python-Anbindung `wx.Irgendwas`.
@BlackJack + cofi
Vielen Dank für Eure Erklärung! Aus Python-Sicht ist das vielleicht nicht unbedingt wichtig, war für mich aber doch interessant.
Nur ist es halt oft so, dass der Teufel gerne im Detail steckt. Und wenn man vom Detail gar nix weiß, dann findet man den Saukerl nicht...
Jedenfalls danke an alle, die mir hier mit Ihrem Wissen (auch um die Details) zur Seite stehen!
Gruß
mutetella
Vielen Dank für Eure Erklärung! Aus Python-Sicht ist das vielleicht nicht unbedingt wichtig, war für mich aber doch interessant.
Ich bin auch für jedes Detail dankbar, für das ich mich nicht interessieren muss...Die Details brauchen dich doch gar nicht zu interessieren...


Jedenfalls danke an alle, die mir hier mit Ihrem Wissen (auch um die Details) zur Seite stehen!
Gruß
mutetella