lo tanto, estoy tratando de averiguar la mejor manera (más elegante con la menor cantidad de código) para permitir anulando las funciones específicas de una propiedad (por ejemplo, sólo el captador, sólo el organismo, etc.) en python. Soy fanático de la siguiente manera de hacer propiedades, debido al hecho de que todos sus métodos están encapsulados en el mismo bloque de código sangrado (es más fácil ver dónde se detienen las funciones relacionadas con una propiedad y las funciones relacionadas con la junto comenzar):propiedades imperiosas de pitón
@apply
def foo():
"""A foobar"""
def fget(self):
return self._foo
def fset(self, val):
self._foo = val
return property(**locals())
Sin embargo, si quiero heredar de una clase que define las propiedades de esta manera, y luego, por ejemplo, reemplazar la función setter foo
, parece complicado. He hecho un poco de búsqueda y la mayoría de las respuestas que he encontrado han sido definir funciones separadas en la clase base (por ejemplo getFoo
y setFoo
), crear explícitamente una definición de propiedad de ellos (por ejemplo foo = property(lambda x: x.getFoo(), lambda x, y: x.setFoo(y), lambda x: x.delFoo())
), y después se anulan getFoo
, setFoo
y delFoo
según sea necesario.
No me gusta esta solución porque significa que tengo que definir lambas para cada propiedad individual, y luego escribir cada llamada a función (cuando antes podría haber hecho property(**locals())
). Tampoco obtengo la encapsulación que tenía originalmente.
Idealmente, lo que le gustaría ser capaz de hacerlo sería algo como esto:
class A(object):
def __init__(self):
self.foo = 8
@apply
def foo():
"""A foobar"""
def fget(self):
return self._foo
def fset(self, val):
self._foo = val
return property(**locals())
class ATimesTwo(A):
@some_decorator
def foo():
def fset(self, val):
self._foo = val * 2
return something
Y entonces la salida sería algo como:
>>> a = A()
>>> a.foo
8
>>> b = ATimesTwo()
>>> b.foo
16
Básicamente, ATimesTwo
hereda el captador función desde A
, pero anula la función de configuración. ¿Alguien sabe de una manera de hacer esto (de una manera que se ve similar al ejemplo anterior)? ¿Qué función tendría el some_decorator
y qué debería devolver la función foo
?
No veo ninguna manera de hacer lo que quiera con un decorador solo porque no tiene acceso al objeto, solo a la función. Supongo que tienes un decorador que devuelve una función que funciona más cuando se llama por primera vez al método, pero luego has sobrescrito el foo inicial. también, como supongo que sabes, no estás realmente usando el lenguaje en el estilo previsto ... pero podrías encontrar una manera de hacerlo con una metaclase. –
Esta pregunta similar puede ser útil: http://stackoverflow.com/questions/237432/python-properties-and-inheritance – stderr