Python API C ++: «Статическая переменная» для объекта типа - PullRequest
5 голосов
/ 16 июля 2010

У меня небольшой вопрос о статической переменной и объектах TypeObject. Я использую API C, чтобы обернуть объект c ++ (назовем его Acpp), который имеет статическую переменную с именем x. Давайте назовем мой TypeObject A_Object:

typedef struct {
  PyObject_HEAD
  Acpp* a;
} A_Object;

TypeObject присоединен к моему модулю Python "myMod" как "A". Я определил getter и setters (tp_getset), чтобы я мог получить доступ и изменить статическую переменную Acpp из python:

>>> import myMod
>>> myA1 = myMod.A(some args...)
>>> myA1.x = 34 # using the setter to set the static variable of Acpp
>>> myA2 = myMod.A(some other args...)
>>> print myA2.x
34
>>> # Ok it works !

Это решение работает, но оно не совсем "чистое". Я хотел бы получить доступ к статической переменной в Python, используя TypeObject, а не экземпляры:

>>> import myMod
>>> myMod.A.x = 34 # what I wish...

У кого-нибудь есть идея, чтобы помочь мне?

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 16 июля 2010

По сути, вы пытаетесь определить «статическое свойство».То есть вы хотите, чтобы функция вызывалась при получении / установке атрибута класса.

Имея это в виду, вы могли бы найти этот поток интересным.В нем говорится только о решениях этой проблемы на уровне Python, а не о типах расширений C, но он охватывает основные принципы.

Для реализации решения, предложенного в этом потоке, для типа расширения C, я думаю, чтоинициализировать tp_dict и добавить к нему запись для «x», значением которой является объект, который соответственно реализует __get__.

0 голосов
/ 16 июля 2010

Вы можете добавить фиктивное поле 'x' в A_Object и создать пару методов set / get.Когда вы обращаетесь к фиктивному полю 'x', метод перенаправляет вызов в статическое поле 'x'.

...