Преобразование объекта в подкласс в Python?

Допустим, у меня есть функция библиотеки, которую я не могу изменить, что создает объект класса A, и я создал класс B, который наследуется от A.

Каков самый простой способ использования библиотечной функции для создания объекта класса B?

edit- меня спрашивали в комментарии для более подробной информации, поэтому здесь идет:

PyTables – это пакет, который обрабатывает иерархические наборы данных в python. Бит, который я использую больше всего, это его способность управлять данными, частично находящимися на диске. Он предоставляет тип «Array», который поставляется только с расширенной срезкой, но мне нужно выбрать произвольные строки. Numpy предлагает эту возможность – вы можете выбрать, предоставив логический массив той же длины, что и массив, из которого вы выбираете. Поэтому я хотел подклассировать Array, чтобы добавить эту новую функциональность.

В более абстрактном смысле это проблема, которую я рассмотрел ранее. Обычное решение, как уже было предложено, имеет конструктор для B, который принимает A и дополнительные аргументы, а затем вытягивает соответствующие биты A для вставки в B. Поскольку это казалось довольно простой проблемой, я задал вопрос чтобы увидеть, есть ли какие-либо стандартные решения, о которых я не знал.

4 Solutions collect form web for “Преобразование объекта в подкласс в Python?”

Поскольку функция библиотеки возвращает A, вы не можете заставить ее возвращать B без его изменения.

Одна вещь, которую вы можете сделать, это написать функцию, чтобы взять поля экземпляра A и скопировать их в новый экземпляр B:

class A: # defined by the library def __init__(self, field): self.field = field class B(A): # your fancy new class def __init__(self, field, field2): self.field = field self.field2 = field2 # B has some fancy extra stuff def b_from_a(a_instance, field2): """Given an instance of A, return a new instance of B.""" return B(a_instance.field, field2) a = A("spam") # this could be your A instance from the library b = b_from_a(a, "ham") # make a new B which has the data from a print b.field, b.field2 # prints "spam ham" 

Изменить: в зависимости от вашей ситуации, композиция вместо наследования может быть хорошей ставкой; то есть ваш класс B может просто содержать экземпляр A вместо наследования:

 class B2: # doesn't have to inherit from A def __init__(self, a, field2): self._a = a # using composition instead self.field2 = field2 @property def field(self): # pass accesses to a return self._a.field # could provide setter, deleter, etc a = A("spam") b = B2(a, "ham") print b.field, b.field2 # prints "spam ham" 

Это можно сделать, если инициализатор подкласса может справиться с этим, или вы пишете явный генератор. Вот пример:

 class A(object): def __init__(self): self.x = 1 class B(A): def __init__(self): super(B, self).__init__() self._init_B() def _init_B(self): self.x += 1 a = A() b = a b.__class__ = B b._init_B() assert bx == 2 

вы можете изменить атрибут .__class__ объекта, если знаете, что делаете :

 In [1]: class A(object): ...: def foo(self): ...: return "foo" ...: In [2]: class B(object): ...: def foo(self): ...: return "bar" ...: In [3]: a = A() In [4]: a.foo() Out[4]: 'foo' In [5]: a.__class__ Out[5]: __main__.A In [6]: a.__class__ = B In [7]: a.foo() Out[7]: 'bar' 

Monkeypatch в библиотеке?

Например,

 import other_library other_library.function_or_class_to_replace = new_function 

Poof, он возвращает все, что вы хотите, чтобы он возвращался.

Monkeypatch A. new, чтобы вернуть экземпляр B?

После вызова obj = A () измените результат так, чтобы obj. class = B?

  • Разделение составных существительных от основных существительных
  • Объявление переменной Python
  • Python 3.1 Проблемы с «Ещё:» в моем коде
  • Как я могу определить, какая другая копия скрипта Python уже запущена
  • Как выставить функцию, возвращающую объект C ++ на Python с помощью Cython?
  • Почему это установленное понимание не работает?
  • Захват вывода на печать из общей библиотеки, вызванный из python с модулем ctypes
  • Python 2 или Python 3? С чего мне начать?
  •  
    Interesting Posts for Van-Lav

    Как сделать новые столбцы в dataframe из строки другого столбца?

    Поток URL-адреса звуковой дорожки, где streamble – false

    Переместить в соседние ячейки с помощью openpyxl

    Какой наиболее точный способ отличить один из 8 цветов?

    почему моя математическая викторина всегда печатает неправильно, когда ответ правильный

    Прогнозирование в Caffe – Исключение: аргументы ввода blob не соответствуют чистым входам

    Получение объектов JSON из текстового файла (с использованием Python)

    Создание модели для манекенов

    Django Tastypie POST Неавторизованный на разных серверах

    Границы диаграммы Voronoi: как получить ребра в форме (point1, point2) из ​​объекта scipy.spatial.Voronoi?

    Как обнаружить тишину в аудиопотоке с помощью pydub?

    Pandas, общая сумма вычислений на каждом подуровне MultiIndex

    Получение даты из сложной строки в Python

    Scrapy – регистрация в файл и stdout одновременно, с именами паук

    передача ответа ответа селена на скрипит

    Python - лучший язык программирования в мире.