Вопрос
Можно ли динамически создавать подклассы? Я знаю, что есть _____ основы ____, но я не хочу воздействовать на все случаи в классе. Я хочу, чтобы объект cf превратился в миксин класса DrvCrystalfontz. Далее в иерархии находится подкласс gobject, который должен быть доступен на этом уровне для подключения сигналов, а приведенного ниже решения недостаточно.
class DrvCrystalfontz:
def __init__(self, model, visitor, obj=None, config=None):
if model not in Models.keys():
error("Unknown Crystalfontz model %s" % model)
return
self.model = Models[model]
if self.model.protocol == 1:
cf = Protocol1(self, visitor, obj, config)
elif self.model.protocol == 2:
cf = Protocol2(self, visitor, obj, config)
elif self.model.protocol == 3:
cf = Protocol3(self, visitor, obj, config)
for key in cf.__dict__.keys():
self.__dict__[key] = cf.__dict__[key]
Решение
Я не уверен, что у меня есть четкое представление о желаемом использовании здесь, но можно динамически создавать подклассы. Вы можете использовать объект type
для динамического создания класса с заданным именем, кортежем базовых классов и набором методов / атрибутов класса, например:
>>> MySub = type("MySub", (DrvCrystalfontz, some_other_class),
{'some_extra method' : lamba self: do_something() })
MySub теперь является подклассом DrvCrystalfontz
и some_other_class
, наследует их методы и добавляет новый (" some_extra_method
") . р>