Python e le classi astratte

Avevo bisogno di una classe virtuale pura che fornisse ai sottotipi un’implementazione standard di alcuni metodi ma che, al contempo, li obbligasse a fornire delle nuove implementazioni degli stessi. Con questa soluzione sono riuscito a raggiungere il risultato voluto, inoltre i metodi sovraccarichi richiamano la versione fornita dalla classe base virtuale.


class Virtual:

    __metaclass__ = ABCMeta

    @abstractmethod
    def _update(self, *args, **kwargs):

        print "metodo virtuale"

    def _method_template(self, _method, *args, **kwargs):

        getattr(self, _method)(*args, **kwargs)
        getattr(Virtual, _method)(self, *args, **kwargs)

    def __getattr__(self, name):

        _method = "_%s" % name
        if _method in Virtual.__abstractmethods__:
            impl_method = lambda *y, **z: Virtual._method_template (self, _method, *y, **z)
            setattr(self, name, impl_method)
            return impl_method
        else:
            raise AttributeError("'%(class)s' object has no attribute '%(attr)s'" % {'class' : self.__class__.__name__,
                                                                                     'attr' : name})


class Class(Virtual):
    def _update(self):
        print "metodo \"reale\""

if __name__ == "__main__":
    c = Class()
    print c
    c.update()

Facebook Twitter Linkedin Plusone Pinterest Email

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *