У меня есть два класса с методом foo
:
Foo = type('Foo', (object,), {'foo': lambda s: 'Foo method'})
Bar = type('Bar', (object,), {'foo': lambda s: 'Bar method'})
И у меня есть другой класс, который мне нужно разделить на подклассы одного из перечисленных выше классов в соответствии с параметром.
Мое решение:
class Subject(object):
def __new__(cls, key):
base = (Foo if key else Bar)
name = cls.__name__ + base.__name__
dict_ = dict(cls.__dict__.items() + base.__dict__.items())
bases = (base, cls)
t = type(name, bases, dict_)
return base.__new__(t)
def bar(self):
return 'Subject method'
Тестирование:
print(Subject(True).foo(), Subject(True).bar())
print(Subject(False).foo(), Subject(False).bar())
Выход:
('Foo method', 'Subject method')
('Bar method', 'Subject method')
Достаточно ли безопасно это решение? Или мне нужно что-то еще узнать? Есть ли еще какой-нибудь питонический способ делать такие нерегулярные вещи?