[C] Klassen und Instanzen

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.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

[C] Klassen und Instanzen

Beitragvon theliquidwave » Freitag 20. März 2009, 14:40

Hi.
Ich habe irgendwie nicht wirklich das gefunden, was ich suche (per Google + Forum). Unzwar möchte ich in meinem Code eine Klasse definieren, die von Python aus benutzt werden kann.

Zum Beispiel folgende Klasse in der C-Extension zur Verfügung stellen (also diese Klasse praktisch in die Extension übersetzen damit ich später von Python aus darauf zugreifen kann):

Code: Alles auswählen

class Player:
    def __init__(self, username):
        self.username = username
        self.health = 100
        self.armor = 100
        self.weapon = "pistol"
    def setHealth(self, health):
        self.health = health
    def setArmor(self, armor):
        self.armor = armor
    def setWeapon(self, weapon):
        self.weapon = weapon


Gibt es zusätzlich die Möglichkeit, eine Instanz dieser Klasse in der Extension zu erstellen und diese zurückzugeben an Python?

~ Chris
Zuletzt geändert von theliquidwave am Freitag 20. März 2009, 14:46, insgesamt 1-mal geändert.
Grüßle.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Freitag 20. März 2009, 14:44

Ja, mehrere Möglichkeiten. Direkt die C-API nutzen, Cython, boost::python, SWIG. Mein Rat: Cython oder SWIG, dann aber mit C++. Am besten erst einmal alles anschauen und dann entscheiden, was Dir am meisten liegt.

Gruß,
Christian
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Beitragvon theliquidwave » Freitag 20. März 2009, 14:57

Hi.
So weit bringt mich das nicht.
Ich habe bereits einige Funktionen in der C Extension verfügbar gemacht, funktioniert auch alles wunderbar. Nur darüber, wie man Klassen definiert und aufrufbar macht finde ich einfach nichts -.-

Habe mich vielleicht falsch ausgedrückt, sorry.

Trotzdem danke!
~ Chris
Grüßle.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Freitag 20. März 2009, 14:58

Diese Klasse ist vor allem abschreckend - getter und setter benötigt man in Python so nicht. Dafür nimmt man ggf. properties!
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Freitag 20. März 2009, 15:01

Was nutzt Du denn? Die C-API oder eine der anderen Alternativen? Sorry, aber ohne diese Info und ggf. auch etwas Code, werden wir Dir nicht helfen können.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Beitragvon theliquidwave » Freitag 20. März 2009, 15:30

Hi.
@ Hyperion: Das war nur ein kleines Beispiel auf die schnelle erstellt.
@ CM: Ah sorry, ganz vergessen. Ich arbeite direkt mit der C-API.
Code den ich bis jetzt habe ist nur der von den Funktionen, hier mal ein Ausschnitt:

Code: Alles auswählen

static PyMethodDef PythonMethods[] = {
    {"help", pyHelp, METH_VARARGS, "Displays help about a command"},
    // usw...
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC init_module(void)
{
    (void)Py_InitModule("myext", PythonMethods);
}

Ich habe noch viele weitere Funktionen, aber der Ansatz für Klassen und Instanzen fehlt mir komplett.

~ Chris
Grüßle.
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Freitag 20. März 2009, 15:47

Code: Alles auswählen

typedef struct {
...
} playerobject;

/* member functions here */

static PyTypeObject Player = {
    /* type header */
    PyObject_HEAD_INIT(&PyType_Type) 0, /* size */
    "player", /* name */
    sizeof(playerobject), /* basic size */
    ...

    /* standard & special methods */
   (destructor) player_dealloc, /* set ref-cout to 0 */
   (setHealth)  player_setHealth,
   ...
};

/* modul logic */
static PyObject * playertype_new(self, args) PyObject *self; PyObject *args;
{
  if (!PyArg_ParseTuple(args, "")) return NULL;
  return (PyObject *) newplayerobject();
}

static PyMethodDef PythonMethods[] = {
    {"help", pyHelp, METH_VARARGS, "Displays help about a command"},
    // usw...
    {NULL, NULL, 0, NULL}
};

PyMODINIT_FUNC init_module(void)
{
    (void)Py_InitModule("myext", PythonMethods);
}


1. Ungetested aus altem Code von mir umgesetzt.
2. Für mich zu umständlich - ich bin irgendwann vor lauter Fehlern auf SWIG umgestiegen.
3. Falls es nicht hilft: Hier muß ich aussteigen - siehe Punkt 1.

Sorry,
Christian
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Beitragvon theliquidwave » Freitag 20. März 2009, 15:54

Cool, danke.
Endlich mal was zum anfassen :D

~ Chris
Grüßle.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7472
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

Beitragvon Hyperion » Freitag 20. März 2009, 15:57

Chrisber hat geschrieben:@ Hyperion: Das war nur ein kleines Beispiel auf die schnelle erstellt.

Hm ... ok - aber auch dann sollte man das nicht so präsentieren. Denn unkommentiert könnten das dann Anfänger finden und sich daran orientieren!

Da ich hier auch oftmals Grütze poste bin ich immer dankbar, wenn mir jemand erfahreneres sagt, dass und was daran schlecht ist :-)
Benutzeravatar
birkenfeld
Python-Forum Veteran
Beiträge: 1603
Registriert: Montag 20. März 2006, 15:29
Wohnort: Die aufstrebende Universitätsstadt bei München

Beitragvon birkenfeld » Freitag 20. März 2009, 21:35

Es gibt ja genügend Typen in Pythons Quellcode selbst, die man sich als Vorbild nehmen kann.
Dann lieber noch Vim 7 als Windows 7.

http://pythonic.pocoo.org/
CM
User
Beiträge: 2464
Registriert: Sonntag 29. August 2004, 19:47
Kontaktdaten:

Beitragvon CM » Montag 23. März 2009, 13:52

Chrisber hat geschrieben:Endlich mal was zum anfassen :D

Ich käme das bei einer wirklich komplexen Anwendung ehrlich gesagt eher nicht. Und wenn Du auch stecken bleibst, weil bei Deinem Spiel die INC- und DECREFs nicht zueinanderpassen: Nicht verzagen, sondern besser auf Alternativen umsteigen.

Gruß,
Christian

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder