2016-10-29 5 views
0

В настоящее время я изучаю, как писать модули расширения Python (v3.5) с использованием API Python C. Некоторые операции, такие как быстрая численная работа, лучше всего выполнять на C, тогда как другие операции, такие как манипуляции с строками, намного проще реализовать в Python. Существует ли согласованный способ использования кода Python и C для определения нового типа?Определение класса Python в Python и C

Например, я написал тип Matrix в C, который поддерживает основные операции хранения и арифметические операции. Я хочу определить Matrix.__str__ с использованием Python, где манипуляции строк намного проще, и мне не нужно беспокоиться о cstrings.

я попытался определить метод __str__ при загрузке модуля в __init__.py следующим образом:

from mymodule._mymodule import Matrix; 

def as_str(self): 
    print("This is a matrix!"); 

Matrix.__str__ = as_str; 

Когда я запускаю этот код, я получаю TypeError: can't set attributes of built-in/extension type 'matey.Matrix'. Есть ли приемлемый способ сделать это? Если вместо этого решение относится к подклассу Matrix, то каков наилучший способ сохранить мои базовые классы C/подклассы Python в рамках модуля?

ответ

0

Лично я бы не стал пытаться делать объектно-ориентированные вещи в C. Я бы хотел написать модуль, который предоставляет некоторые (без гражданства) функции.

Если бы я хотел, чтобы интерфейс Python был ориентирован на объекты, я бы написал класс в Python, который импортирует модуль (C extension) и потребляет из него функции. Поддержание любого состояния будет выполнено на Python.

+0

Структуры, вероятно, пригодится для сложных данных (например, матрицы). Посмотрите на ctypes.Structure – eddiewould

+0

Хорошая идея. Тем не менее, я пытаюсь подражать тому, как работают массивы «numpy» (просто чтобы узнать, я знаю лучше, чем рулон моих собственных линейных алгоритмов в процессе производства). Я хотел бы сохранить матричные данные в C, так как копирование взад и вперед будет слишком медленным. –

+0

Да, отсюда мое предложение использовать C-структуры для представления матричных данных. Вы можете получить доступ к этим C-структурам на Python без «копирования назад вперед». – eddiewould

0

Вы могли бы вместо того, чтобы определить _Matrix тип, который вы затем продлить с традиционным объектным подходом

from mymodule._mymodule import _Matrix; 

class Matrix(_Matrix): 
    def __str__(self): 
     return "This is a matrix!" 

 Смежные вопросы

  • Нет связанных вопросов^_^