[Python] property polimorfica

Marco Giusti marco.giusti a gmail.com
Mer 4 Giu 2014 13:05:36 CEST


On Tue, Jun 03, 2014 at 04:43:29PM -0400, Piergiuliano Bossi wrote:
> 2014-06-03 10:00 GMT-04:00 Marco Giusti <marco.giusti a gmail.com>:
> 
> > > Ho messo alcuni esempi qua sotto. L'opzione #1 e' orrida, ma e' anche
> > > quella che richiede meno copia e incolla.
> >
> > Questo, per me, è sufficiente ad una risposta per essere corretta.
> > Inoltre se il comportamento cambia in base alla (sotto)classe, un metodo
> > è più che giustificato.
> >
> >
> Beh, ma in questo caso volevo limitarmi a una property. Quando vai di
> override preferisci buttare via la property e modellare con metodi?

Simone ha ben riassunto l'utilità delle property: in fase di refactoring
poi trasformare l'accesso ad un attributo in una chiamata a funzione
senza cambiare il codice cliente. Ma se ho la scelta preferisco
modellare con i metodi

Un'altra soluzione è quella di creare una property specifica, ma anche
questa è alquanto poco pulita.


	class PolyProperty(object):

		def __init__(self, getter_name, setter_name):
			self.getter_name = getter_name
			self.setter_name = setter_name

		def __get__(self, instance, owner):
			if instance is None:
				raise AttributeError()
			return getattr(instance, self.getter_name)()

		def __set__(self, instance, value):
			return getattr(instance, self.setter_name)(value)


	class Foo(object):

		_foo = None

		def get_foo(self):
			return self._foo

		def set_foo(self, value):
			self._foo = value

		foo = PolyProperty("get_foo", "set_foo")


	class Bar(Foo):

		def set_foo(self, value):
			Foo.set_foo(self, value * 2)


	f = Foo()
	print f.foo
	f.foo = 42
	print f.foo

	b = Bar()
	print b.foo
	b.foo = 42
	print b.foo


Ciao
m.


Maggiori informazioni sulla lista Python