Domanda

È possibile effettuare la sottoclasse dinamica? So che ci sono ____base____ ma non voglio effettuare tutte le istanze della classe. Voglio che l'oggetto si riferisca al polimorfo in un mixin della classe DrvCrystalfontz. Più avanti nella gerarchia c'è una sottoclasse di gobject che deve essere disponibile a questo livello per collegare i segnali e la soluzione di seguito non è sufficiente.

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]
È stato utile?

Soluzione

Non sono sicuro di essere chiaro sull'uso desiderato qui, ma è possibile effettuare la sottoclasse in modo dinamico. Puoi usare l'oggetto type per costruire dinamicamente una classe con un nome, una tupla di classi base e un dettato di metodi / attributi di classe, ad esempio:

>>> MySub = type("MySub", (DrvCrystalfontz, some_other_class), 
         {'some_extra method' : lamba self: do_something() })

MySub è ora una sottoclasse di DrvCrystalfontz e some_other_class , eredita i loro metodi e ne aggiunge uno nuovo (" some_extra_method ") .

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top