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