Изменить список классов, от которых наследуется класс - PullRequest
3 голосов
/ 13 апреля 2019

Я полностью осознаю, что это НЕ то, что вы обычно хотите сделать.

Я использую библиотеку, показывающую (к сожалению) большую проверку типов. У меня есть рабочее решение, однако, только когда одна из этих проверок типов в библиотеке закомментирована. Я хотел бы иметь решение, которое не требует модификации кода библиотеки.

Чтобы быть более конкретным, мне нужно обойти этот кусок кода:

def is_valid(arg):
    return inspect.isclass(arg) and issubclass(arg, SomeClass)

Невозможно, чтобы мой arg был подклассом SomeClass из-за некоторых вещей, происходящих в метаклассе SomeClass, что нежелательно для моего случая.

Так что единственный вариант - взломать. Могу ли я как-то заставить Python думать, что arg наследуется от SomeClass, а на самом деле нет

1 Ответ

2 голосов
/ 13 апреля 2019

Полагаю, вы могли бы сделать это ...

import inspect

def is_valid(arg):
    return inspect.isclass(arg) and issubclass(arg, Base)

class OtherType(type):
    pass

class Base(metaclass=OtherType):
    pass

class SurpriseBase:
    pass

class SurpriseDerived(SurpriseBase):
    pass

print(f'SurpriseDerived is_valid: {is_valid(SurpriseDerived)}')

SurpriseDerived.__bases__ = (Base,)

print(f'Base metaclass: {type(Base)}')
print(f'SurpriseDerived metaclass: {type(SurpriseDerived)}')
print(f'SurpriseDerived is_valid: {is_valid(SurpriseDerived)}')

Выход:

SurpriseDerived is_valid: False
Base metaclass: <class '__main__.OtherType'>
SurpriseDerived metaclass: <class 'type'>
SurpriseDerived is_valid: True
...