[C-API] Konstanten in Typen?

Python in C/C++ embedden, C-Module, ctypes, Cython, SWIG, SIP etc sind hier richtig.
Antworten
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Hallo.
Wie ist das C-API Äquivalent zu folgendem Python Code? Damit meine ich die Konstanten innerhalb von Klassen.

Code: Alles auswählen

class Test(object):
    ONE = 1
    TWO = 2
Gruß & Danke
Grüßle.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

Klassen sind Instanzen der Klasse type oder einer ihrer Subklassen (letzter Fall fast nie gegeben). Bei Konstruktion der Klasse B wird type() das dict übergeben, welches alle Variablen im Klassenscope beinhaltet. Der Vollständigkeit halber sein erwähnt, dass aus den Funktionen dieses dicts dann unbound methods konstruiert werden (dh, Methoden erfahren vom Scope selbst her keine Sonderbehandlung). Du musst also die entsprechende Instanz von type finden und dich von dort aus weiterhangeln.

Code: Alles auswählen

>>> def metafunc(name, bases, dict):
...  print name, bases, dict
...  return type(name, bases, dict)
... 
>>> class B(object):
...  __metaclass__ = metafunc
...  P = 42
...  def method(self):
...   print self
... 
B (<type 'object'>,) {'P': 42, '__module__': '__main__', '__metaclass__': <function metafunc at 0xb73b06f4>, 'method': <function method at 0xb715ec34>}
BlackJack

@str1442: Also so wie ich das verstanden habe, wollte theliquidwave wissen wie man das in C schreibt. Also `Test` nicht in Python sondern als in C geschriebener Datentyp für Python.

@theliquidwave: Du musst einfach in das `__dict__` vom `Test`-Typ (PyTypeObject) die Einträge für die Attribute `ONE` und `TWO` machen. Also mit `PyDict_SetItem()` in das `tp_dict` vom Typobjekt. Oder mit `PyObject_SetAttr()` auf dem Typobjekt.
theliquidwave
User
Beiträge: 221
Registriert: Sonntag 1. Juni 2008, 09:08

Danke BlackJack. Ich wusste gar nicht, dass es legal ist, den tp_dict-Member zu verändern. Grandios!

Gruß
Grüßle.
Benutzeravatar
str1442
User
Beiträge: 520
Registriert: Samstag 31. Mai 2008, 21:13

@BlackJack
@theliquidwave: Du musst einfach in das `__dict__` vom `Test`-Typ (PyTypeObject) die Einträge für die Attribute `ONE` und `TWO` machen. Also mit `PyDict_SetItem()` in das `tp_dict` vom Typobjekt. Oder mit `PyObject_SetAttr()` auf dem Typobjekt.
Er muss also die Instanz von type finden und sich von dort aus weiterhangeln ;) An dem letztem Satz hätte ich noch feilen sollen, alles vorherige sollte den nötigen Kontext geben.
Antworten