Альтернатива установке self.__class__ на что-то другое?Python

Программы на Python
Anonymous
Альтернатива установке self.__class__ на что-то другое?

Сообщение Anonymous »

Как правильно добавить метод к любому члену набора одноуровневых экземпляров (т. е. класс каждого экземпляра наследуется от общего базового класса)?
Близнецы берутся из fsspec< /code> и находятся вне моего контроля, но это так.

Код: Выделить всё

class Base:
def open(self): pass
def read(self): pass

class A(Base):
def read(self): pass

class B(Base):
def read(self): pass
Там может быть C, а какой-то плагин может добавить D... это вне моего контроля. Весь мой код — это экземпляр некоторого подкласса Base.
Мой код получает этот экземпляр и должен передать его в другую библиотеку, ожидающую подкласс Base >. Но я хочу добавить к этому экземпляру еще одну функцию (не такую, которая будет полезна вне моего кода).
На мой взгляд, моя функция будет представлять собой метод миксин.

Код: Выделить всё

class Mixin:
def feature(self): pass
Тогда кажется, что следующее помогает достичь моих целей, но имеет множество недостатков.

Код: Выделить всё

for Item in (A, B):
item = Item()
item.__class__ = type("Item", (item.__class__, Mixin), {})
assert isinstance(item, Base)
assert item.open.__func__ is Base.open
assert item.read.__func__ is Item.read
assert item.feature.__func__ is Mixin.feature
Присвоение item.__class__ не для новичков, поэтому меня интересуют предложенные abarnert альтернативы (третий находится вне моего контроля):
  • "Используйте фабрику для динамического создания экземпляра соответствующего класса вместо создания базового экземпляра и последующего объединения его в производный."
  • "Используйте __new__ или другие механизмы, чтобы перехватить конструкцию."
Я не могу придумать, как это сделать. один, при этом все еще достигая целей, указанных выше в качестве утверждений. Спасибо, что указали мне путь!

Подробнее здесь: https://stackoverflow.com/questions/790 ... thing-else

Вернуться в «Python»