[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