Python: невозможно наследовать от расширения C - PullRequest
6 голосов
/ 04 апреля 2010

Я пытаюсь добавить несколько дополнительных методов к типу матрицы из библиотеки pysparse. Кроме того, я хочу, чтобы новый класс вел себя точно так же, как и оригинал, поэтому я решил реализовать изменения, используя наследование. Тем не менее, когда я пытаюсь

from pysparse import spmatrix

class ll_mat(spmatrix.ll_mat):
    pass

это приводит к следующей ошибке

TypeError: Error when calling the metaclass bases
    cannot create 'builtin_function_or_method' instances

Что это вызывает эту ошибку? Есть ли способ использовать делегирование, чтобы мой новый класс вел себя точно так же, как и исходный?

1 Ответ

9 голосов
/ 04 апреля 2010

ll_mat задокументировано как функция , а не сам тип. Идиома известна как «фабричная функция» - она ​​позволяет «вызываемому создателю» возвращать различные фактические базовые типы в зависимости от своих аргументов.

Вы можете попытаться сгенерировать объект из этого, а затем наследовать от типа этого объекта:

x = spmatrix.ll_mat(10, 10)
class ll_mat(type(x)): ...

имейте в виду, что встроенный тип вполне может объявить, что он не поддерживает подклассы (это можно сделать даже для того, чтобы сэкономить некоторые скромные накладные расходы); если это то, что делает этот тип, то вы не можете создать его подкласс, и вам, скорее всего, придется использовать сдерживание и делегирование, т.е.

class ll_mat(object):
    def __init__(self, *a, **k):
        self.m = spmatrix.ll_mat(*a, **k)
        ...
    def __getattr__(self, n):
        return getattr(self.m, n)

и т. Д. И т. П.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...