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