Seite 1 von 1

[C] Klassen und Instanzen

Verfasst: Freitag 20. März 2009, 14:40
von theliquidwave
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

Verfasst: Freitag 20. März 2009, 14:44
von CM
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

Verfasst: Freitag 20. März 2009, 14:57
von theliquidwave
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

Verfasst: Freitag 20. März 2009, 14:58
von Hyperion
Diese Klasse ist vor allem abschreckend - getter und setter benötigt man in Python so nicht. Dafür nimmt man ggf. properties!

Verfasst: Freitag 20. März 2009, 15:01
von CM
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.

Verfasst: Freitag 20. März 2009, 15:30
von theliquidwave
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

Verfasst: Freitag 20. März 2009, 15:47
von CM

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

Verfasst: Freitag 20. März 2009, 15:54
von theliquidwave
Cool, danke.
Endlich mal was zum anfassen :D

~ Chris

Verfasst: Freitag 20. März 2009, 15:57
von Hyperion
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 :-)

Verfasst: Freitag 20. März 2009, 21:35
von birkenfeld
Es gibt ja genügend Typen in Pythons Quellcode selbst, die man sich als Vorbild nehmen kann.

Verfasst: Montag 23. März 2009, 13:52
von CM
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