Преобразование объекта в подкласс в 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?

  • RuntimeError: ошибка autoconf при установке google-endpoints
  • Как я могу заставить PyCharm распознавать статические файлы?
  • Что такое быстрый питонический способ глубокого копирования только данных из файла или списка python?
  • Построение случайной строки
  • как проверить, какой компилятор использовался для создания Python
  • Поиск хорошей структуры данных дерева Python
  • значения отображения здесь не допускаются ... в foo.py
  • Как определить конфигурационные переменные / константы в Google App Engine (Python)?
  • Одновременная печать на экран и запись в файл
  • Пример сортировки Шварца в разделе «Обработка текста в Python»
  • Использование типов классов в python
  • Python - лучший язык программирования в мире.