Magazine Informatica

Python e le classi astratte

Creato il 16 marzo 2012 da Alessio

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()

Ritornare alla prima pagina di Logo Paperblog