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

Leave a comment