Actualmente estoy parcheando una propiedad de una clase de una biblioteca para hacerlo más versátil.¿Por qué property.fget es un atributo de solo lectura?
que estoy haciendo esto usando el siguiente código que funciona muy bien:
_orig_is_xhr = BaseRequest.is_xhr.fget
_orig_is_xhr_doc = BaseRequest.is_xhr.__doc__
BaseRequest.is_xhr = property(lambda self: _orig_is_xhr(self) or
'_iframe-xhr' in request.form, doc=_orig_is_xhr_doc)
Sin embargo, sería mucho mejor si yo podría simplemente sobrescribir la función getter así se conserva la cadena de documentación:
_orig_is_xhr = BaseRequest.is_xhr.fget
BaseRequest.is_xhr.fget = lambda self: (_orig_is_xhr(self) or
'_iframe-xhr' in request.form)
Esto no funciona porque property.fget
es un atributo de solo lectura (TypeError: readonly attribute
cuando intenta asignarlo). Tengo curiosidad si hay una razón especial para esto o si los desarrolladores de Python simplemente pensaron que no tiene sentido modificar una propiedad después de crearla sin reemplazarla por una nueva.
Je, agradable - no voy a cortar la pitón fuente, sin embargo: p – ThiefMaster
Por supuesto :-) Solo estaba señalando que no hay nada más exótico detrás de la lectura-solo-ness. – samplebias
Las propiedades mutables crearían algunas oportunidades aterradoras para los efectos secundarios no intencionales. 'Thread.ident.fget = Thread.daemon.fget' ¿Alguien? – ncoghlan