Может ли тип расширения Python наследовать только получатели или установщики от своего базового типа? - PullRequest
0 голосов
/ 28 мая 2019

У меня есть базовый тип, который я назову base_type.Для базового типа я определил следующий массив PyGetSetDef:

PyGetSetDef base_getsetters[] = {

    {"field1", (getter) base_get_field1, (setter) base_set_field1, NULL, NULL},
    {"field2", (getter) base_get_field2, (setter) base_set_field2, NULL, NULL},  
    {"field3", (getter) base_get_field3, (setter) base_set_field3, NULL, NULL}, 
    {NULL}

};

и назначаю его соответствующим образом:

PyTypeObject base_type = {
    ...
    .tp_getset = base_getsetters,
    ...
};

Я хочу расширить base_type с помощью sub_type,Я хочу, чтобы sub_type унаследовал только получатели от base_type, но при этом определяя новые установщики.

Так что после установки base_type как .tp_base в определении модуля для sub_type, он будет иметь все те же поля, что и base_type.Ура!Но это если я еще не определил никаких пользовательских сеттеров для sub_type.

Я попробовал следующее:

PyGetSetDef sub_getsetters[] = {

    {"field1", NULL, (setter) sub_set_field1, NULL, NULL},
    {NULL}

};

Когда я создаю экземпляр sub_type в Python, все триполя все еще там, и field2 и field3 все еще работают так же, как base_type, но попытка прочитать field1 дает ошибку:

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: attribute 'field1' of 'mymodule.sub_type' objects is not readable

Я предполагаю, что это потому, что яустановите getter на NULL в определениях getter и setter sub_type, но я не знаю, как определить только setter для типа.Это вообще возможно, или мне нужно переопределить метод получения, назначив тот же метод, который я использовал для base_type?

...